Java算法_AcWing40:顺时针打印矩阵

AcWing40:顺时针打印矩阵

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

数据范围

矩阵中元素数量 [0,400]。

样例

输入:
[
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12]
]

输出:[1,2,3,4,8,12,11,10,9,5,6,7]

解析图

image-20221230203610463

AC

package AcWing._40_顺时针打印矩阵;

public class Main {

    public static void main(String[] args) {
        int[][] matrix = {
                {1, 2, 3, 4},
                {5, 6, 7, 8},
                {9, 10, 11, 12}
        };
        /*System.out.println(printMatrix(matrix));*/
        for (int a : printMatrix(matrix)) {
            System.out.print(a);
            System.out.print(' ');
        }
    }

    public static int[] printMatrix(int[][] matrix) {

        int m = matrix.length;      //矩阵列长度
        if (m == 0) {
            return new int[0];      //如果出现[],返回空数组
        }

        int n = matrix[0].length;   //矩阵行长度
        if (n == 0) {
            return new int[0];      //如果出现[[],[]],返回空数组
        }

        int[] ans = new int[m * n];     //返回的数组
        int temp = 0;       //ans数组中的自增变量
        int a = 0, b = n - 1, c = 0, d = m - 1;

        while (true) {

            //++可以正好避免同一个值添加两次的场面
            for (int i = a; i <= b; i++) {      //a到b是矩阵第一行
                ans[temp++] = matrix[c][i];     //从左往右,上边界不变
            }
            if (++c > d) break;     //该行遍历完了,上边界就往下走一行,如果超过下边界就退出

            for (int i = c; i <= d; i++) {      //c到d是矩阵最右边的列
                ans[temp++] = matrix[i][b];     //从上往下,右边界不变
            }
            if (--b < a) break;     //该列遍历完了,右边界就往左走一列,如果超过左边界就退出

            for (int i = b; i >= a; i--) {      //b到a是最下面的行
                ans[temp++] = matrix[d][i];     //从右往左,下边界不变
            }
            if (--d < c) break;     //该行遍历完了,下边界就往上走一行,如果超过上边界就退出

            for (int i = d; i >= c; i--) {      //d到c是中间的一行
                ans[temp++] = matrix[i][a];     //从下往上,左边界不变
            }
            if (++a > b) break;     //该列遍历完了,左边界就往右走一行,如果超过右边界就退出

        }
        return ans;

    }
}

image-20221230183107921

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

要什么自行车儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值