题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字, 例如,如果输入如下4 X 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.
麻烦、曲折、令人头疼的题目🤦
刚开始把题目看成了n * n的矩阵…痛哭流涕,看题一定要清晰!!
思路
矩阵有四种情况:
- 空矩阵
- 1 * n 矩阵 {1,2,3,4}
- n * m 矩阵 {{1,2,3,4},{5,6,7,8},{9,10,11,12}}
- m * n 矩阵 {{1,2,3},{4,5,6},{7,8,9},{10,11,12}}
- 设置四个始末变量
- stX stY endX endY
- 顺时针顺序打印就是up right down left 这个顺序来打印矩阵
- 每次打印完一个方向,我们就改变始末变量的值
- 一共有 row*col 个元素,每次 add 我们都 count++
- 直到 count == cow*col 为止打印结束
- 每次打印完一个方向,我们就改变始末变量的值
代码实现
public ArrayList<Integer> printMatrix(int[][] matrix) {
if (matrix == null) return null;
int col = matrix[0].length;
int row = matrix.length;
ArrayList<Integer> res = new ArrayList<>();
int tmp = Math.min(col, row);
int circle = ((tmp & 1) == 1) ? (tmp / 2 + 1) : (tmp / 2);
int count = 0;
int all = col * row;
int stX = 0;
int stY = 0;
int endX = col - 1;
int endY = row - 1;
for (int cir = 1; cir <= circle; cir++) {
// up
for (int i = stX; i <= endX; i++) {
res.add(matrix[cir - 1][i]);
count++;
}
if (count == all) break;
// 改变right方向的起始位置
stY++;
// right
for (int i = stY; i <= endY; i++) {
res.add(matrix[i][col - cir]);
count++;
}
if (count == all) break;
// 改变down方向的起始位置
endX--;
// down
for (int i = endX; i >= stX; i--) {
res.add(matrix[row - cir][i]);
count++;
}
if (count == all) break;
// 改变left的起始位置
endY--;
// left
for (int i = endY; i >= stY; i--) {
res.add(matrix[i][cir - 1]);
count++;
}
if (count == all) break;
// 改变up方向的起始位置
stX++;
}
return res;
}