题目:
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
如:
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)。
那第n轮肯定就是(n-1,n-1)了。
那么从(0,0)开始到多少截至呢?
比如说矩阵的列数为4,一圈减掉2个,需要走2(0,0~~1,1)次;如果列数为5,需要走3(0,0~~1,1~~2,2)次。
光看列数的话,需要满足0<2*n<colums
循环的条件应该是
2n<colums && 2n<rows
public void print(int[][] array, int cols, int rows) {
if (array == null || cols < 0 || rows < 0) {
throw new RuntimeException();
}
int start = 0;
while (start * 2 < cols && start * 2 < rows) {
printMatrix(array, cols, rows, start++);
}
}
接着再看具体的应该怎么打印矩形:
应该是分为四步:
1.从左到右(上层)
2.从上到下(右层)
3.从右到左(下层)
4.从下到上(左层)
顺时针的话,就是这样一个顺序。。。
要注意的就是:
1.上层的从左到右的最后一个打印过了,右层的从上到下就不再打印第一个了
2.右层的从上到下打印过最后一个了,下层的从右到左也就不再打印打印第一个了
3.上层以及下层的都打印过第一个元素了,所以左层的从下到上首位都不应该打印。
还有就是如果剩下的矩阵只有一列或者一行的情况
private void printMatrix(int[][] array, int cols, int rows, int start) {
int endX = cols - start;
int endY = rows - start;
// 从左到右
for (int i = start; i < endX; i++) {
System.out.println(array[start][i]);
}
// 从上往下(右)
if (start < endY-1) {
for (int i = start + 1; i < endY; i++) {
System.out.println(array[i][endX - 1]);
}
}
// 从右往左(下)
if (start < endX-1 && start < endY-1) {
for (int i = endX - 2; i >= start; i--) {
System.out.println(array[endY - 1][i]);
}
}
// 从下往上(左)
if (start < endX-1 && start < endY - 2) {
for (int i = endY - 2; i >= start + 1; i--) {
System.out.println(array[i][start]);
}
}
}