题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.
解题思路:
这道题重点在于边界条件的判断是否准确,然后顺时针一圈一圈的打印就可以了。
打印一圈分为四个步骤:
(1)从左到右打印一行;
(2)从上到下打印一列;
(3)从右到左打印一行;
(4)从下到上打印一列。
每一步根据起始坐标和终止坐标用一个循环就可以打印出一行或者一列。但是最后一圈可能只有一行、只有一列或者只有一个数,这时就不再需要以上四步来完成,所以需要进一步细化打印每一步的前提条件:
(1)第一步是必须的,因为打印一圈至少需要一步。如果只有一行就不需要第二步了。
(2)执行第二步的前提条件是终止的行号大于起始的行号;
(3)执行第三步的前提条件是终止行号大于起始行号,并且终止列号大于起始列号;
(4)执行第四步的前提条件是终止的行号比起始的行号至少大2,同时终止的列号要大于起始列号。
具体代码如下:
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
int rows = matrix.length;
int columns = matrix[0].length;
if(matrix == null || rows <=0 || columns <=0){
return null;
}
ArrayList<Integer> arr = new ArrayList<>();
int start = 0;
while (columns > start *2 && rows >start * 2){
int endX = columns - 1 -start;//列数
int endY = rows -1 - start;//行数
//从左到右打印一行
for(int i = start;i<= endX;i++){
//int number = array[start][i];
arr.add(matrix[start][i]);
}
//从上到下打印一列
if (endY>start){
for(int i = start+1;i<=endY;i++){
arr.add(matrix[i][endX]);
}
}
//从右到左打印一行
if(endX>start && endY>start){
for(int i = endX-1;i>=start;i--){
arr.add(matrix[endY][i]);
}
}
//从下到上打印一列
if(endX>start && start<endY-1) {
for (int i = endY - 1; i >= start + 1; i--) {
arr.add(matrix[i][start]);
}
}
start = start + 1;
}
return arr;
}
}