题目:
输入一个矩阵,按照从外到里以顺时针的顺序依次打印出每一个数字。
示例:
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
结果打印 1、2、3、4、8、12、16、15、14、13、9、5、6、7、11、10
答案:
每次循环打印一圈,能否继续打印一圈的判断条件是rows > 2 * start && columns > 2 * start
每打印一圈,分四个步骤:
从左到右打印。
从上到下打印。
从右到左打印。
从下到上打印。
注意每一步能否打印的条件。
public void printMatrix(int[][] matrix) {
if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
return;
}
int rows = matrix.length;
int columns = matrix[0].length;
int start = 0;
//循环打印一圈,打印的起点为(0,0),然后(1,1)
while (rows > 2 * start && columns > 2 * start) {
printCircle(matrix, rows, columns, start);
start++;
}
}
private void printCircle(int[][] matrix, int rows, int columns, int start) {
//打印这一圈的最大行数
int endRow = rows - 1 - start;
//打印这一圈的最大列数
int endColumn = columns - 1 - start;
//从左到右打印一行
for (int i = start; i <= endColumn; i++) {
System.out.print(matrix[start][i]);
System.out.print(" ");
}
//注意判断条件
if (endRow > start) {
//从上到下打印一行
for (int i = start + 1; i <= endRow; i++) {
System.out.print(matrix[i][endColumn]);
System.out.print(" ");
}
//注意判断条件
if (endColumn > start) {
//从右到左打印一行
for (int i = endColumn - 1; i >= start; i--) {
System.out.print(matrix[endRow][i]);
System.out.print(" ");
}
//注意判断条件
if (endRow > start + 1){
//从下到上打印一行
for (int i = endRow - 1; i > start ; i--) {
System.out.print(matrix[i][start]);
System.out.print(" ");
}
}
}
}
}