顺时针打印矩阵

前言

最近在刷《剑指offer》算法题,看到了顺时针打印矩阵的题目,感觉作者处理这个题目时逻辑有点复杂,是通过找规律解决的,我想这种方式如果真的在面试时估计很难想出来,因此自己思考,使用最简单直观的方式来解决。

题目

输入一个矩阵,按照从外往里以顺时针的顺序依次打印每一个数,如下:
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行(列增加),接下来是打印第3列(行增加),接着打印第3行(列减小),接着打印第0列(行减小,最后不要重复打印第一个数字)。因此思路十分清晰,分类打印即可。
接着是打印次外层,还是上面的思路,所以显然想到用到递归的方式完成。
同时还需要考虑到特殊情况,比如只有一行或者只有一列。

代码

public static void printMatrixOrder(int[][] matrix,int minRow,int minCol,int maxRow,int 
            maxCol){
        if(matrix == null){
            return;
        }
        if(maxCol == 0){//单行
            for(int i=minRow;i<=maxRow;i++){
                System.out.print(matrix[i][0] +" ");
            }
        }else if(maxRow == 0){//单列
            for(int i=minCol;i<=maxCol;i++){
                System.out.print(matrix[0][i] +" ");
            }
        }else{//非单行单列
            int curRow = minRow;
            int curCol = minCol;
            //行不变,列增大
            for(;curCol<=maxCol;curCol++){
                System.out.print(matrix[curRow][curCol] +" ");
            }
            System.out.println();
            curCol--;
            curRow++;
            //列不变,行增大
            for(;curRow<=maxRow;curRow++){
                System.out.print(matrix[curRow][curCol] +" ");
            }
            System.out.println();
            curRow --;
            curCol --;
            //行不变,列减小
            for(;curCol>=minCol;curCol--){
                System.out.print(matrix[curRow][curCol] +" ");
            }
            System.out.println();
            curCol ++;
            curRow --;
            //列不变,行减小
            for(;curRow>minRow;curRow--){
                System.out.print(matrix[curRow][curCol] +" ");
            }
            System.out.println();
            if(minCol +1< maxCol && minRow +1 <maxRow){
                printMatrixOrder(matrix, minRow+1, minCol+1, maxRow-1, maxCol-1);
            }
        }
    }

结果测试

测试用例


image.png

测试结果


image.png

备注:这里为了直观,用换行的方式显示了。

源码下载

https://github.com/HudsonAndroid/printMatrix

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容