题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.
思路
把矩阵现象为若干个圈组成,用一个循环来输出矩阵。
首先分析循环结束的条件,打印第一圈左上角坐标为(0,0),第二圈左上角坐标为(1,1),以此类推每次循环的行列起始坐标都是相同的(start,start)。因此可以分析出循环继续的条件是columns > start2并且rows > start2。有了循环继续的条件后,我们要分析每次循环那4步的前提条件。第一步肯定是必定会经过的,因为打印一圈至少有一步。第二步的前提是终止行号大于起始行号,第三步的前提是终止行号大于起始行号,终止列号大于起始列号,因为圈内至少有2行2列,第四步的前提条件是终止行号比起始行号至少大2,终止列号大于起始行号,即至少有3行2列。
代码
public ArrayList<Integer> printMatrix(int [][] matrix) {
ArrayList<Integer> res =new ArrayList<>();
if(matrix ==null || matrix.length<=0){
return null;
}
int start = 0;
while(matrix.length > start*2 && matrix[0].length > start*2){
circle(matrix,start,res);
start++;
}
return res;
}
public void circle(int [][] matrix,int start,ArrayList<Integer> list){
int row = matrix.length;
int col = matrix[0].length;
int endx = row - start;
int endy = col - start;
//第一步
for(int i =start;i<endy;i++){
list.add(matrix[start][i]);
}
//第二步
for(int i =start+1;i<endx;i++){
list.add(matrix[i][endy-1]);
}
//第三步
if (start < endy-1 && start < endx-1) {
for(int i =endy-1-1;i>=start;i--){
list.add(matrix[endx-1][i]);
}
}
//第四步
if (start < endy-1 && start < endx - 2) {
for(int i =endx-1-1;i>start;i--){
list.add(matrix[i][start]);
}
}
}