美文网首页
顺时针打印矩阵

顺时针打印矩阵

作者: _hudson_ | 来源:发表于2017-11-11 11:15 被阅读0次

    前言

    最近在刷《剑指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

    相关文章

      网友评论

          本文标题:顺时针打印矩阵

          本文链接:https://www.haomeiwen.com/subject/jnswmxtx.html