算法初级——转圈打印矩阵

* 【题目】 给定一个整型矩阵matrix,请按照转圈的方式打印它。
* 例如: 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
* 【要求】 额外空间复杂度为O(1)。

/*
* 转圈打印主要就是扣边界,思想很简单,给出每一圈的左上角和右下角坐标,进行一圈的打印,
* 然后左上角和右下角同时向对角线内靠拢,同时需要考虑一行和一列的情况
*/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public class 转圈打印矩阵 {
   

    public static void main(String[] args) {
        int[][] matrix = { { 1, 2, 3, 4 } , { 5, 6, 7, 8 }, { 9, 10, 11, 12 },
                { 13, 14, 15, 16 }};
        print(matrix);

    }
    private static void print(int[][] matrix) {
        int a = 0; //行
        int b = 0; //列
        int c = matrix.length-1; //行
        int d = matrix[0].length-1; //列
        while(a <= c && b <= d) {
            printedge(matrix,a++,b++,c--,d--);
        }      
    }
    private static void printedge(int[][] matrix, int a, int b, int c, int d) {
        if(a == c) { //只有一行
            for(int i = b;i<=d;i++) {
                System.out.print(matrix[a][i]+" ");
            }
        }else if(b == d) { //只有一列
            for(int i =a;i<=c;i++) {
                System.out.print(matrix[i][b]+" ");
            }
        }else {
            int i = b;
            while(i < d) {
                System.out.print(matrix[a][i++]+" ");
            }
            i = a;
            while(i < c) {
                System.out.print(matrix[i++][d]+" ");
            }
            i = d;
            while(i > b) {
                System.out.print(matrix[c][i--]+" ");
            }
            i = c;
            while(i > a) {
                System.out.print(matrix[i--][b]+" ");
            }      
        }      
    }
}
0 条评论
发表一条评论