输入一个矩阵,按照从外向里以顺时针的顺序一次打印出每一个数字。例如:输入如下矩阵:
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),右下角坐标(3,3)可以表示这个矩阵。每次只要将最外层的一圈用左上角和右下角两个点的坐标表示出来。
1 2 3 4
5 8
9 12
13 14 15 16
要考虑的特殊情况是只剩一行或者一列。此时就只需要从左往右输出或者从上到下输出就可以了。
主要代码如下
public static void spiralOrderPrint(int[][] arr){
// arr(tR,tC) 起始坐标 arr(dR,dC) 结束坐标
// 用这两个坐标可以代表一个子矩阵。
int tR = 0;
int tC = 0;
int dR = arr.length -1;
int dC = arr[0].length -1;
while (tR <= dR && tC <= dC){ //当左上角坐标跑到了右下角坐标的右方和下方,循环停止。
printEdge(arr,tR++,tC++,dR--,dC--);
}
}
private static void printMatrixCircle(int[][] matrix, int tR, int tC, int dR, int dC) {
if (tR == dR){ //只有一行
for (int i=tC;i<=dC;i++){
System.out.print(matrix[tR][i]);
}
}else if (tC == dC){ //只有一列
for (int i=tR;i<=dR;i++){
System.out.println(matrix[i][tC]);
}
}else{ //常规一圈
int curC = tC;
int curR = tR;
while (curC != dC){ //从左到右
System.out.print(matrix[tR][curC]);
curC++;
}
while (curR != dR){ //从上到下
System.out.print(matrix[curR][dC]);
curR++;
}
while (curC != tC){ //从右到左
System.out.print(matrix[dR][curC]);
curC--;
}
while (curR != tR){ //从下到上
System.out.print(matrix[curR][tC]);
curR--;
}
}
}