1 回答

TA貢獻1821條經(jīng)驗 獲得超6個贊
嘗試迭代左傾對角線使得很難始終知道我正在使用的數(shù)組的長度。特別是因為我創(chuàng)建的新 char[] 數(shù)組的長度不同。
要根據(jù)您在矩陣中的當前位置(使用索引和)計算對角線的長度(新的大?。?,請執(zhí)行此操作char[]bigArrayij
int newCharArrayLength = Math.min(height - i, width - j);
實施(以下解釋)
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;
}
一個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
解釋和算法
初始化一個
List
。char[]
這是您在每次迭代中放置對角線的地方計算
numberOfDiagonals
矩形的總數(shù)。您可以通過將寬度和高度相加減一(重復角)來做到這一點計算你的
i
指數(shù)。這可以通過從對角線索引減去 1 減去矩形的寬度來完成(因為我們從 0 開始索引)。該指數(shù)應始終為正計算你的
j
指數(shù)。與以前的原理相同,但您反轉(zhuǎn)減法,因為我們需要反向?qū)蔷€。這也需要積極計算你的
currentDiagonalLength
. 要做到這一點更小,當前行和高度或當前列和寬度之間的距離(i)
(j)
初始化一個數(shù)組,該數(shù)組將使用先前計算的長度保存您的對角線
一項一項地添加項目。在每次迭代中增加當前行
i
和當前列j
將該數(shù)組附加到步驟 1中提到的列表中
重復步驟 3到步驟 8,直到完成所有對角線
添加回答
舉報