1. 本题知识点
数组
2. 题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字
例如:
输入如下 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
3. 解题思路
- 可以把矩阵看成若干个圈,从外向里以顺时针打印,每次打印矩阵中的一圈。
- 每一圈从该圈的左上角开始,可以发现起点的行下标和列下标是相等的。
- 由于矩阵并不一定是方阵,最后一圈有可能退化为只有一行,只有一列,甚至只有一个数,因此要注意进行判断,避免重复打印。
4. 代码
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int[][] matrix) {
// list 记录打印顺序
ArrayList<Integer> list = new ArrayList<>();
int row = matrix.length; // 总行数
int col = matrix[0].length; // 总列数
// 循环打印每一圈,count 记录圈数
for (int count = 0; 2 * count < row && 2 * count < col; count++) {
// 本圈行数
int endX = row - 1 - count;
// 本圈列数
int endY = col - 1 - count;
// 从左到右
for (int i = count; i <= endY; i++) {
list.add(matrix[count][i]);
}
// 从上到下
for (int i = count + 1; i <= endX; i++) {
list.add(matrix[i][endY]);
}
// 从右到左,如果只有一行,要避免重复打印
if (endX > count) {
for (int i = endY - 1; i >= count; i--) {
list.add(matrix[endX][i]);
}
}
// 从下到上,如果只有一列,要避免重复打印
if (endY > count) {
for (int i = endX - 1; i > count; i--) {
list.add(matrix[i][count]);
}
}
}
return list;
}
}