顺时针打印矩阵

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

           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,0),第二圈的坐标为(1,1),依次类推。左上角的坐标中行标和列标总是相同的,于是可以在矩阵中选取左上角为(start,start)的一圈作为我们分析的目标。每次去掉外面的行和列,每次行和列减少2,因此推断出让循环继续的条件是columns>startX*2并且rows>startY*

 void printMatrixClockwisely(int[][] numbers) {
        numbers=new int[1][1];
        numbers[0][0]=1;
        if (numbers == null || numbers[0].length <= 0 ||  numbers.length <= 0) {
            return ;
        }
        int start = 0;
        while (numbers[0].length > start * 2 &&  numbers.length > start * 2) {
            printMatrixIncircle(numbers,  numbers[0].length, numbers.length, start);
            ++start;
        }
    }

打印一圈的功能:分为四步,第一步从左到右打印一行,第二步从上到下打印一列,第三步从右到左打印一行,第四步从下到上打印一列。每一步根据起始坐标和终止坐标用一个循环就能打印一列或者一行

这里写图片描述

分析每一步的前提条件

第一步总是需要的,因为打印一圈至少有一步,如果只有一行,就不用第二步。也就是第二步的前提是终止行号大于起始行号。需要第三部打印的前提是圈内至少有两行两列,也就是除了终止行号大于起始行号,还要终止列号大于起始列号,同理,打印第四步的前提条件是至少有三行两列,因此要求终止行号比起始行号至少大2,同时终止列号大于起始列号

void printMatrixIncircle(int[][] numbers, int columns, int rows, int start) {
        int endX = columns - 1 - start;
        int endY = rows - 1 - start;
        for (int i = start; i <=endX; ++i) {
            int number=numbers[start][i];
            printNumber(number);
        }
        //从上打印到下
        if (start<endY){
            for (int i=start+1;i<=endY;++i){
                int number=numbers[i][endX];
                printNumber(number);
            }
        }
        //从右到左打印一行
        if (start<endX&&start<endY){
            for (int i=endX-1;i>=start;--i){
                int number=numbers[endY][i];
                printNumber(number);
            }
        }
        //从右到左打印一行
        if (start<endX&&start<endY-1){
            for (int i=endY-1;i>=start+1;--i){
                int number=numbers[i][start];
                printNumber(number);
            }
        }

    }
    void printNumber(int number){
        System.out.print(number);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值