题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印每一个数字,例如,如果输入如下4*4矩阵:
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。
解题思路
- 因为一个二维平面,给定两个坐标(x1, y1)和(x2, y2)可以唯一确定一个矩阵。
- 然后可以通过圈子来打印对应的矩阵,然后缩小圈子完成整个过程即可。
图解过程
这个时候就打印出了1,2,3,4,8,12,16,15,14,13,9,5。
然后这个时候缩小圈子继续重复:
这个时候继续打印出6,7,11,10。然后全部拼接起来就是答案了。
代码
import java.util.ArrayList;
/**
* @author god-jiang
* @date 2020/1/17 20:58
*/
public class Solution {
static ArrayList<Integer> resList = new ArrayList<>();
public static ArrayList<Integer> printMatrix(int[][] matrix) {
//拿到左上角(x1, y1)和右下角(x2, y2)
int x1 = 0;
int y1 = 0;
int x2 = matrix.length - 1;
int y2 = matrix[0].length - 1;
//顺时针打印圈子的数值
while (x1 <= x2 && y1 <= y2) {
helpPrintMatrix(matrix, x1++, y1++, x2--, y2--);
}
return resList;
}
public static void helpPrintMatrix(int[][] matrix, int x1, int y1, int x2, int y2) {
if (x1 == x2) {
for (int i = y1; i <= y2; i++) {
resList.add(matrix[x1][i]);
}
} else if (y1 == y2) {
for (int i = x1; i <= x2; i++) {
resList.add(matrix[i][y1]);
}
//知道(x1, y1)和(x2, y2)可以确定一个矩阵
} else {
int curX = x1;
int curY = y1;
while (curY != y2) {
resList.add(matrix[x1][curY]);
curY++;
}
while (curX != x2) {
resList.add(matrix[curX][y2]);
curX++;
}
while (curY != y1) {
resList.add(matrix[x2][curY]);
curY--;
}
while (curX != x1) {
resList.add(matrix[curX][y1]);
curX--;
}
}
}
}
通过截图:
总结
如果你要是通过规律来顺时针打印矩阵的话会显得非常麻烦,我不是说不按照我的方法做不出来,只是会比较麻烦,coding能力较差的人可能会写不出来,但是把一个矩阵分解成多个圈子打印即可,打印单独写一个函数,然后一圈一圈的打印(调用打印函数)即可完成。
PS:觉得博主写的还可以的点点赞,关注走一波,谢谢大家的支持了~~~