题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:
12345678910111213141516则依次打印出数字【1、2、3、4、8、12、16、15、14、13、9、5、6、7、11、10】。
思路 从外向里打印,第1层、第2层、第3层,即:1->2->3,每次打印1圈,每圈分四步打印。 难点在于边界条件的判定。
Java 代码如下:
import java.util.ArrayList; public class Solution { public ArrayList<Integer> printMatrix(int[][] matrix) { int rows = matrix.length; int cols = matrix[0].length; ArrayList<Integer> list = new ArrayList<>(); int start = 0; // start代表层数 // 对于一个6 * 6的矩阵而言,最后一圈需要打印四个数字 // 它的左上角坐标是(2,2),满足6 > 2 * 2 while(2 * start < rows && 2 * start < cols) { // 不能写成 rows/2 的形式 int endX = cols - start - 1; int endY = rows - start - 1; // 第一行是肯定要打印的 for(int i = start; i <= endX; i++) { list.add(matrix[start][i]); } // 第二步的条件是终止行号大于起始行号 if(start < endY) { for(int i = start + 1; i <= endY; i++) { list.add(matrix[i][endX]); } } // 第三步的条件是至少两行两列,终止行号大于起始行号 并且终止列号大于起始列号 if(start < endX && start < endY) { for(int i = endX - 1; i >= start; i--) { list.add(matrix[endY][i]); } } // 第四步的条件是至少有三行两列,终止行号至少比起始行号大2,终止列号大于起始列号 if(start < endX && start < endY - 1) { for(int i = endY - 1; i >= start + 1; i--) { list.add(matrix[i][start]); } } start++; // 一层一层向里打印 } return list; } }