我试图弄清楚如何对角打印 NxN 矩阵。现在我可以打印从左到右的对角线,但不能打印从右到左的对角线。假设矩阵是:
1 2 3
4 5 6
7 8 9
Run Code Online (Sandbox Code Playgroud)
现在我可以从左到右打印:
1
4 2
7 5 3
8 6
9
Run Code Online (Sandbox Code Playgroud)
但我还想从右到左打印:
3
6 2
9 5 1
8 4
7
Run Code Online (Sandbox Code Playgroud)
这是从左到右的代码:
public static void printLeftToRightDiagonal(int[][] matrix) {
int length = matrix.length;
int diagonalLines = (length + length) - 1;
int itemsInDiagonal = 0;
int midPoint = (diagonalLines / 2) + 1;
for (int i = 1; i <= diagonalLines; i++) {
int rowIndex;
int columnIndex;
if (i <= midPoint) {
itemsInDiagonal++;
for (int j = 0; j < itemsInDiagonal; j++) {
rowIndex = (i - j) - 1;
columnIndex = j;
System.out.print(matrix[rowIndex][columnIndex] + " ");
}
} else {
itemsInDiagonal--;
for (int j = 0; j < itemsInDiagonal; j++) {
rowIndex = (length - 1) - j;
columnIndex = (i - length) + j;
System.out.print(matrix[rowIndex][columnIndex] + " ");
}
}
System.out.println();
}
}
Run Code Online (Sandbox Code Playgroud)
我试图找出其中的模式,但我没有任何想法
该问题可以分为两个任务:
第一条规则相当于编写如下方法:
//example for matrix[2, 2] it will print 9 5 1
private static void printReverseDiagonal(int[][] matrix, int i, int j) {
System.out.print(matrix[i][j]);
for (int row = i - 1, column = j - 1; row >= 0 && column >= 0; --row, --column) {
System.out.print(" " + matrix[row][column]);
}
System.out.println();
}
Run Code Online (Sandbox Code Playgroud)
第二条规则相当于编写一个循环迭代元素矩阵 [0, n - 1], 矩阵 [1, n - 1] ... 矩阵 [n - 1, n - 1] 和另一个循环迭代元素矩阵 [ n - 2, n - 1], 矩阵[n - 3, n - 1] .... 矩阵[0, n - 1] 如下所示:
public static void printRightToLeftDiagonal(int[][] matrix) {
int n = matrix.length;
int j = n - 1;
for (int i = 0; i < n; ++i) {
printReverseDiagonal(matrix, i, j);
}
int i = n - 1;
for(j = n - 2; j >= 0; --j) {
printReverseDiagonal(matrix, i, j);
}
}
Run Code Online (Sandbox Code Playgroud)
结合这两个函数,您可以获得预期的结果。