题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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.
解题思路
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
分为四步来操作,即从左向右打印,从上往下打印,从右向左打印,从下往上打印,如此循环一圈。
进行一次循环会打印两行两列,因而终止条件为打印的次数*2小于行的数量和列的数量。
最后一圈打印的时候要进行判断,分几种情况 如
情况1:
6 7 8
情况2:
2 3
4 5
6 7
情况3:
8 9
10 11
情况1仅需要从左到右打印,情况二都需要,情况3不需要从下向上,因而需要进行边界判断。
import java.util.ArrayList;
public class shunshizhendayinjuzhen {
public ArrayList<Integer> printMatrix(int[][] matrix) {
int rowStart = 0, rowEnd = matrix.length - 1, colStart = 0, colEnd = matrix[0].length - 1;
ArrayList<Integer> list = new ArrayList<>();
int count = 0;
while (count * 2 < rowEnd + 1 && count * 2 < colEnd + 1) {
// 从左到右
for (int i = colStart + count; i <= colEnd - count; i++) {
list.add(matrix[count][i]);
}
// 从上到下
if (count < rowEnd - count)
for (int i = rowStart + 1 + count; i <= rowEnd - count; i++) {
list.add(matrix[i][colEnd - count]);
}
// 从右到左
if (count < rowEnd - count && count < colEnd - count)
for (int i = colEnd - count - 1; i >= count; i--) {
list.add(matrix[rowEnd - count][i]);
}
// 从下到上
if (count < rowEnd - count + 1 && count < colEnd - count)
for (int i = rowEnd - count - 1; i > count; i--) {
list.add(matrix[i][count]);
}
count++;
}
return list;
}
public static void main(String[] args) {
int[][] array = new int[][] { { 1 } };
System.out.println(new shunshizhendayinjuzhen().printMatrix(array));
}
}