题目

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

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。

思路

从左到右,再从上到下,再从右到左,最后从下到上遍历。

其实这种题思路很简单,考的就是代码能力。所以这种题目一定要多练习,不要因为思路就不做,相信我,你不做你面试的时候一定出问题

代码

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--;
            }
        }
    }
}

原文地址 https://mp.weixin.qq.com/s/A0x8EDvw91p54MVGYnqVQg

原创面试复习图(点击菜单获取)