题目描述:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:如果输入如下矩阵:
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
解题思路:
我们可以把矩阵想象成若干个圈,我们可以用一个循环来打印矩阵,每一次打印矩阵中的一个圈。
如下图:
分析循环结束的条件:
第一圈开始的坐标是(0,0)
第二圈开始的坐标是(1,1)
…
…
于是我们选取矩阵中选取左上角(start, start) 的一圈作为分析目标:
对于5×5的矩阵,最后一圈只有一个数字,对应的坐标为(2, 2)
上方输出了2行,那么下方也输出了2行。5 > 2 × 2,对于一个6×6矩阵而言,最后一圈有4个数字 6 > 2 × 2,依然成立。于是我们可以得出,让循环继续的条件是 columns > startX × 2并且
rows > startY × 2。
public static void printMatrixClockwisely(int[][] numbers, int columns, int rows){
if(numbers == null || columns <= 0 || columns <= 0){
return;
}
int start = 0;
while(columns > start * 2 && rows > start * 2){
printMatrixIncCircle(numbers, columns, rows, start);
start ++;
}
}
下面分析怎么打印一圈的数:
打印矩阵最里面一圈可能只需要三步、两步甚至一步
第一步:从左右向右总是需要的
第二步:从上到下,条件:终止行号 > 初始行号
第三步:从右到左,条件:终止行号 > 初始行号 && 终止列号 > 初始列号
第四步:从上到下,条件:终止列号 > 初始列号 && 终止行号 > 开始行号 + 1
public static void printMatrixIncCircle(int[][] numbers, int columns,
int rows, int start) {
int endX = columns - 1 - start;
int endY = rows - 1 - start;
for(int i = start; i <= endX; i++){
System.out.println(numbers[start][i]);
}
if(endY > start){
for(int i = start + 1; i <= endY; i++){
System.out.println(numbers[i][endX]);
}
}
if(endY > start && endX > start){
for(int i = endX - 1; i >= start; i--){
System.out.println(numbers[endY][i]);
}
}
if(endY - start > 1 && endX > start){
for(int i = endY - 1; i >= start + 1; i--){
System.out.println(numbers[i][start]);
}
}
}