1 回答

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超6個(gè)贊
嘗試迭代左傾對(duì)角線使得很難始終知道我正在使用的數(shù)組的長度。特別是因?yàn)槲覄?chuàng)建的新 char[] 數(shù)組的長度不同。
要根據(jù)您在矩陣中的當(dāng)前位置(使用索引和)計(jì)算對(duì)角線的長度(新的大?。?,請(qǐng)執(zhí)行此操作char[]bigArrayij
int newCharArrayLength = Math.min(height - i, width - j);
實(shí)施(以下解釋)
private static List<char[]> getDiagonalsList(char[][] arr) {
List<char[]> ans = new ArrayList<>();
int height = arr.length;
int width = arr[0].length;
int numberOfDiagonals = arr.length + arr[0].length - 1;
for (int diagonalIdx = 0; diagonalIdx < numberOfDiagonals; diagonalIdx++) {
int i = Math.max(diagonalIdx - width + 1, 0);
int j = Math.max(width - diagonalIdx - 1, 0);
int currentDiagonalLength = Math.min(height - i, width - j);
int idx = 0;
char[] charArr = new char[currentDiagonalLength];
while (i < height && j < width)
charArr[idx++] = arr[i++][j++];
ans.add(charArr);
}
return ans;
}
一個(gè)main函數(shù)
您可以編寫這樣的main函數(shù)來輸出結(jié)果
public static void main(String[] args) {
char[][] arr = {
{'a', 'b', 'c', 'd', 'e', 'q'},
{'f', 'g', 'h', 'i', 'j', 'w'},
{'k', 'l', 'm', 'n', 'o', 'e'},
{'p', 'q', 'r', 's', 't', 'r'},
{'u', 'v', 'w', 'x', 'z', 't'}};
for (char[] diag : diagonal(arr))
System.out.println(diag);
}
輸出
結(jié)果將如下所示
q
ew
dje
cior
bhntt
agmsz
flrx
kqw
pv
u
解釋和算法
初始化一個(gè)
List
。char[]
這是您在每次迭代中放置對(duì)角線的地方計(jì)算
numberOfDiagonals
矩形的總數(shù)。您可以通過將寬度和高度相加減一(重復(fù)角)來做到這一點(diǎn)計(jì)算你的
i
指數(shù)。這可以通過從對(duì)角線索引減去 1 減去矩形的寬度來完成(因?yàn)槲覀儚?0 開始索引)。該指數(shù)應(yīng)始終為正計(jì)算你的
j
指數(shù)。與以前的原理相同,但您反轉(zhuǎn)減法,因?yàn)槲覀冃枰聪驅(qū)蔷€。這也需要積極計(jì)算你的
currentDiagonalLength
. 要做到這一點(diǎn)更小,當(dāng)前行和高度或當(dāng)前列和寬度之間的距離(i)
(j)
初始化一個(gè)數(shù)組,該數(shù)組將使用先前計(jì)算的長度保存您的對(duì)角線
一項(xiàng)一項(xiàng)地添加項(xiàng)目。在每次迭代中增加當(dāng)前行
i
和當(dāng)前列j
將該數(shù)組附加到步驟 1中提到的列表中
重復(fù)步驟 3到步驟 8,直到完成所有對(duì)角線
添加回答
舉報(bào)