《剑指offer》第20题 顺时针打印矩阵(Java版答案)

题目:

输入一个矩阵,按照从外到里以顺时针的顺序依次打印出每一个数字。

示例:

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

答案:

每次循环打印一圈,能否继续打印一圈的判断条件是rows > 2 * start && columns > 2 * start

每打印一圈,分四个步骤:

从左到右打印。

从上到下打印。

从右到左打印。

从下到上打印。

 

注意每一步能否打印的条件。

public void printMatrix(int[][] matrix) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) {
            return;
        }

        int rows = matrix.length;
        int columns = matrix[0].length;
        int start = 0;
        //循环打印一圈,打印的起点为(0,0),然后(1,1)
        while (rows > 2 * start && columns > 2 * start) {
            printCircle(matrix, rows, columns, start);
            start++;
        }
    }

    private void printCircle(int[][] matrix, int rows, int columns, int start) {
        //打印这一圈的最大行数
        int endRow = rows - 1 - start;
        //打印这一圈的最大列数
        int endColumn = columns - 1 - start;
        //从左到右打印一行
        for (int i = start; i <= endColumn; i++) {
            System.out.print(matrix[start][i]);
            System.out.print(" ");
        }
        //注意判断条件
        if (endRow > start) {
            //从上到下打印一行
            for (int i = start + 1; i <= endRow; i++) {
                System.out.print(matrix[i][endColumn]);
                System.out.print(" ");
            }
            //注意判断条件
            if (endColumn > start) {
                //从右到左打印一行
                for (int i = endColumn - 1; i >= start; i--) {
                    System.out.print(matrix[endRow][i]);
                    System.out.print(" ");
                }
                //注意判断条件
                if (endRow > start + 1){
                    //从下到上打印一行
                    for (int i = endRow - 1; i > start ; i--) {
                        System.out.print(matrix[i][start]);
                        System.out.print(" ");
                    }
                }
            }
        }
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值