【剑指Offer 20】顺时针打印矩阵

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

代码如下:

package demo;

public class Test20 {
    public static void printMatrixClockWisely(int[][] numbers) {
        if(numbers == null) {
            return;
        }
        // 记录一环开始位置的行
        int x = 0;
        // 记录一环开始位置的列
        int y = 0;
        while(x*2 < numbers.length && y*2 < numbers[0].length) {
            printMatrixInCircle(numbers, x, y);
            x++;
            y++;
        }
    }

    private static void printMatrixInCircle(int[][] numbers, int x, int y) {
        // 数组的行数
        int rows = numbers.length;
        // 数组的列数
        int cols = numbers[0].length;
        // 输出环的最上面的一行
        for(int i = y; i <= cols - y - 1; i++) {
            System.out.print(numbers[x][i] + "");
        }
    
        // rows-x-1:环的最下面的一行的行号
        // rows-x-1 > x:表明环不只有一行
        if(rows-x-1 > x) {
            // 因为右边那列最上面的那个已经被输出了,因此行从x+1开始,一只输出到最下面一行
            for(int i=x+1;i<=rows-x-1;i++) {
                System.out.print(numbers[i][cols-y-1]+"");
            }
        }
    
        // cols-1-y>y:环不只有一列。这样才会进行第3步,输出下面一行
        if(rows-1-x > x && cols-1-y > y) {
            // 因为环的右下角的位置已经输出了,因此列号从cols-y-2开始
            for(int i = cols-y-2; i >= y; i--) {
                System.out.print(numbers[rows-1-x][i] + "");
            }
        }
    
        // 至少有3行,才会进行第4步
        if(cols-1-y>y && rows-1-x > x+1) {
            // 因为最左边一列的第1个和最后1个都已经被输出了,
            // 因此从倒数第2行(rows-1-x-1),输出到第2行(x+1)
            for(int i = rows-1-x-1;i>=x+1;i--) {
                System.out.print(numbers[i][y]+"");
            }
        }
    }
}

来源:http://blog.csdn.net/derrantcm/article/details/46691013

你可能感兴趣的:(【剑指Offer 20】顺时针打印矩阵)