【剑指offer-Java版】20顺时针打印矩阵

顺时针打印矩阵:重在理解,毕竟作者分析的那个方法看起来还是蛮复杂的-所以自己写了个接地气的方法

重在逻辑的一个题,一次性完全写对还是比较困难的


    public class _Q20 {

    public void PrintMatrixClockwisely(int matrix[][]){
        if(matrix == null) return;

        int start = 0;
        int col = matrix[0].length;
        if(col <= 0) return;

        int row = matrix.length;
        if(row <= 0) return;

        while(col > (start<<1) && row > (start<<1)){
            PrintMatrixInCircle(matrix, start, row, col);
            ++start;
        }
        System.out.println();
    }

    public void PrintMatrixInCircle(int matrix[][], int start, int row, int col){

        boolean flags[] = {true, false, false, false}; // 保证先序关系

        // step1:打印第一步
        int indexX = start;
        for(int j=start; j<=(col - start -1); j++){
            flags[1] = true;
            System.out.print(matrix[indexX][j] + " ");
        }

        // step2:打印第二步-前提是第一步成功打印
        int indexY = col - start -1;
        for(int i=(start+1); i<=(row - start -1); i++){
            if(flags[1] == false) break;
            flags[2] = true;
            System.out.print(matrix[i][indexY] + " ");
        }

        // step3:打印第三步-前提是第二步成功打印
        indexX = row - start -1;
        for(int j=(col - start -2);j>=start; j--){
            if(flags[2] == false) break;
            flags[3] = true;
            System.out.print(matrix[indexX][j] + " ");
        }

        // step4:打印第四步-前提是第三步成功打印
        indexY = start;
        for(int i=(row - start -2); i> start; i--){
            if(flags[3] == false) break;
            System.out.print(matrix[i][indexY] + " ");
        }
    }
    }

测试代码:


    public class _Q20Test extends TestCase {

    _Q20 matrixPrinter = new _Q20();

    public void test(){
        int matrix1[][] = {
                {1, 2, 3, 4},
                {5, 6, 7, 8},
                {9, 10, 11, 12},
                {13, 14, 15, 16}};

        int matrix2[][] = {
                {1, 2, 3, 4},
                {5, 6, 7, 8}};

        int matrix3[][] = {{1}}; // 一行一列

        int matrix4[][] = {{1, 2, 3, 4}}; // 一行

        int matrix5[][] = {{1}, {2}, {3}, {4}}; // 一列

        int matrix6[][] = null;

        System.out.println("-------------------------matrix1");
        matrixPrinter.PrintMatrixClockwisely(matrix1);
        System.out.println("-------------------------matrix2");
        matrixPrinter.PrintMatrixClockwisely(matrix2);
        System.out.println("-------------------------matrix3");
        matrixPrinter.PrintMatrixClockwisely(matrix3);
        System.out.println("-------------------------matrix4");
        matrixPrinter.PrintMatrixClockwisely(matrix4);
        System.out.println("-------------------------matrix5");
        matrixPrinter.PrintMatrixClockwisely(matrix5);
        System.out.println("-------------------------matrix6");
        matrixPrinter.PrintMatrixClockwisely(matrix6);
    }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值