顺时针打印矩阵

题目

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:

 

则依次打印出数组:1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10。

思路

将结果存入vector数组,从左到右,再从上到下,再从右到左,最后从下到上遍历。

代码

public class Test2 {
    public static void main(String[] args) {
        int[][] matrix ={
  {1,2,3},{4,5,6},{7,8,9}};
        System.out.println(spiralOrder(matrix));
    }
    public static ArrayList<Integer> spiralOrder(int [][] matrix){
        ArrayList<Integer> list = new ArrayList<Integer>();
        int topRow = 0;
        int topCol = 0;
        int downRow = matrix.length - 1;
        int downCol = matrix[0].length - 1;
        while (topRow <= downRow && topCol <= downCol) {
            //当满足左上角的小于等于右下角就可以循环
            printCircle(list, matrix, topRow++, topCol++, downRow--, downCol--);
        }
        return list;
    }
    public static void printCircle(ArrayList<Integer> list, int [][] matrix, int topRow, int topCol, int downRow, int downCol) {
        if (topRow == downRow) {
            //子矩阵只有一行的时候
            for (int i = topCol; i <= downCol; i++) {
                //注意循环开始的条件,是从这一列开始,不是从零
                list.add(matrix[topRow][i]);
            }
        }
        else if (topCol == downCol) {
            //子矩阵只有一列的时候
            for (int i = topRow; i <= downRow; i++) {
                list.add(matrix[i][topCol]);
            }
        }
        else { //其他的情况下
            int currentRow = topRow;
            int currentCol = topCol;
            while (currentCol != downCol) {
                //左到右 本行最后一个不访问,在下个循环里面。如图
                list.add(matrix[topRow][currentCol]);
                currentCol++;
            }
            while (currentRow != downRow) {
                //上到下0
                list.add(matrix[currentRow][downCol]);
                currentRow++;
            }
            while (currentCol != topCol) {
                //右到左
                list.add(matrix[downRow][currentCol]);
                currentCol--;
            }
            while (currentRow != topRow) {
                //下到上
                list.add(matrix[currentRow][topCol]);
                currentRow--;
            }
        }
    }
}