题解 | #调整数组顺序使奇数位于偶数前面#

顺时针打印矩阵

http://www.nowcoder.com/practice/9b4c81a02cd34f76be2659fa0d54342a

题目描述:

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 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.

该题一看就很简单,但我循环就是一下子写不出来。
想了一下,觉得可以通过抽象拆分解决该题。
针对如下的矩阵

1 2 3
4 5 6
7 8 9

对其进行顺时针打印,则输出应该为

1 2 3 6 9 8 7 4

最后加上

5

也就是说,针对任意矩阵,我们可以拆分成任意个嵌套的矩阵,从外向内依次由左上角开始打印。

比如,针对如下矩阵

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

可拆分成

11 12 13 14 15
16 20
21 25
26 30
31 32 33 34 35

17 18 19
22 23 24
27 28 29

以及

23

如此拆分即可完成。
AC代码如下。

    public ArrayList<Integer> printMatrix(int [][] matrix) {
        int row = matrix.length;
        int column = matrix[0].length;
        ArrayList<Integer> res = new ArrayList<>();
        if(column == 1){
            for(int i = 0;i<row;i++){
                res.add(matrix[i][0]);
            }        
            return res;
        }
        if(row == 1){
            for(int i = 0;i< column;i ++){
                res.add(matrix[0][i]);
            }
            return res;
        }
        // 将打印分为多个矩形
        // 每个矩形都从左上角打印到右下角
        int iMin = 0, jMin = 0;
        int i = 0, j = 0;
        int iMax = row, jMax = column;
        while (iMin < iMax && jMin < jMax) {
            // 打印第一行,保持i不变j递增
            for (i = jMin, j = jMin; j < jMax; j++) {
                res.add(matrix[i][j]);
            }
            if (res.size() == column * row) {
                return res;
            }
            j--;
            // 打印最后一列,保持j不变i递增
            for (i = jMin + 1; i < iMax; i++) {
                res.add(matrix[i][j]);
            }
            if (res.size() == column * row) {
                return res;
            }
            i--;
            // 打印最后一行,保持i不变j递减
            for (j = jMax - 2; j > jMin; j--) {
                res.add(matrix[i][j]);
            }
            if (res.size() == column * row) {
                return res;
            }
            // 打印第一列,保持j不变i递减
            for (; i > iMin ; i--) {
                res.add(matrix[i][j]);
            }
            // 矩形打印完成,缩小矩阵
            jMin++;
            iMin++;
            iMax--;
            jMax--;
        }
        return res;
    }
全部评论

相关推荐

点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务