剑指 Offer - 19 - 顺时针打印矩阵

发布于 2024-07-03 14:39:51 字数 1778 浏览 24 评论 0

题目

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

解析

题目本身很容易,但是代码容易写的很乱,所以这里考虑一种宏观思考问题的思想。

  • 使用矩阵分圈处理的方式,在矩阵中使用 (ar,ac) 表示左上角, (br,bc) 表示矩阵的右下角;
  • 每次只需要通过这四个变量打印一个矩阵,然后用一个宏观的函数来调用打印的局部的函数,这样调理更加清晰;

代码

import java.util.ArrayList;
public class Solution {

    private ArrayList<Integer> res;

    public ArrayList<Integer> printMatrix(int[][] matrix) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0)
            return null;
        res = new ArrayList<>();
        int ar = 0, ac = 0, br = matrix.length - 1, bc = matrix[0].length - 1;
        while (ar <= br && ac <= bc)
            print(ar++, ac++, br--, bc--, matrix);
        return res;
    }

    private void print(int ar, int ac, int br, int bc, int[][] matrix) {
        if (ar == br)
            for (int j = ac; j <= bc; j++) res.add(matrix[ar][j]);
        else if (ac == bc)
            for (int i = ar; i <= br; i++) res.add(matrix[i][ac]);
        else {
            for (int j = ac; j < bc; j++) res.add(matrix[ar][j]);
            for (int i = ar; i < br; i++) res.add(matrix[i][bc]);
            for (int j = bc; j > ac; j--) res.add(matrix[br][j]);
            for (int i = br; i > ar; i--) res.add(matrix[i][ac]);
        }
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

薄荷梦

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

我们的影子

文章 0 评论 0

素年丶

文章 0 评论 0

南笙

文章 0 评论 0

18215568913

文章 0 评论 0

qq_xk7Ean

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文