美文网首页
顺时针打印环形矩阵

顺时针打印环形矩阵

作者: from0 | 来源:发表于2018-05-29 18:33 被阅读35次

新浪和轻芒面试都遇到一道简单的算法题。不会做的话真是太丢人了。

一边听音乐,一边把代码撸出来了。听歌有时可以使注意力集中哦,而且会感觉放松,面试有时紧张,简单的问题都会容易错。

问题:给出一个 m*n 的矩阵,顺时针打印这个矩阵。例如这是一个 3行x3列的矩阵:

1 2 3 
5 5 6 
4 5 7 

打印的结果就是:1,2,3,6,7,5,4,5,5,6

思路:正常思路就是按顺序遍历,关键是做好边界处理,定好循环条件。

  • 一次遍历一行或一列,遍历到头。
  • 记录当前遍历到哪一行哪一列了
  • 记录当前还剩多少行,多少列没有遍历,依据这个来决定要不要继续循环
  • 记录当前的遍历的起始点。比如例子中遍历的顺序是:
  1. 0-2列 : 1,2,3
  2. 1-2行 : 6,7
  3. 1-0列 : 5,4
  4. 1-1行 : 5
  5. 1-2列 : 5,6

按照这个规律来写代码, 虽然变量有点多,不过我觉得这样思路很清晰。


    public static List<Integer> print(int[][] matrix) {
        List<Integer> results = new ArrayList<>();

        // 读完后剩余的行数
        int remainingRows = matrix.length;
        // 读完后剩余的列数
        int remainingColumns = matrix[0].length;

        // 标记当前应从第几列开始读
        int startColumn = 0;
        // 标记当前应读到哪一列结束
        int endColumn;

        // 标记当前应从第几行开始读
        int startRow;
        // 标记当前应读到哪一行结束
        int endRow;

        // 标记当前的读到了第几列
        int curColumns = 0;
        // 标记当前的读到了第几行
        int curRows = 0;


        // 循环条件:当还有剩余的 列/行 没遍历
        while (remainingColumns > 0 || remainingRows > 0) {

            // 顺时针开始循环

            // 1.从左到右打印第一行
            if (remainingRows <= 0) return results;
            if (startColumn > 0) {
                startColumn = curColumns + 1;
            } else {
                startColumn = 0;
            }
            endColumn = startColumn + remainingColumns - 1;
            System.out.println("从" + startColumn + "列-" + endColumn + "列开始遍历");
            for (int i = startColumn; i <= endColumn; i++) {
                curColumns = i;
                results.add(matrix[curRows][i]);
            }
            // 读完一行-1
            remainingRows--;
            System.out.println("还剩" + remainingRows + "行,当前是第" + curColumns + "列");


            // 2.从上到下
            if (remainingColumns <= 0) return results;
            startRow = curRows + 1;
            endRow = startRow + remainingRows - 1;
            System.out.println("从" + startRow + "行-" + endRow + "行开始遍历");
            for (int i = startRow; i <= endRow; i++) {
                curRows = i;
                results.add(matrix[i][curColumns]);
            }
            remainingColumns--;
            System.out.println("还剩" + remainingColumns + "列");

            // 3. 从右到左
            if (remainingRows <= 0) return results;
            startColumn = curColumns - 1;
            endColumn = startColumn - remainingColumns + 1;
            System.out.println("从" + startColumn + "列-" + endColumn + "列开始遍历");
            for (int i = startColumn; i >= endColumn; i--) {
                curColumns = i;
                results.add(matrix[curRows][i]);
            }
            remainingRows--;
            System.out.println("还剩" + remainingRows + "行,当前是第" + curColumns + "列");


            // 4. 从下到上
            if (remainingColumns <= 0) return results;
            startRow = curRows - 1;
            endRow = startRow - remainingRows + 1;
            System.out.println("从" + startRow + "行-" + endRow + "行开始遍历");
            for (int i = startRow; i >= endRow; i--) {
                curRows = i;
                results.add(matrix[i][curColumns]);
            }
            remainingColumns--;
            System.out.println("还剩" + remainingColumns + "列");

        }

        return results;
    }

相关文章

  • 顺时针打印环形矩阵

    新浪和轻芒面试都遇到一道简单的算法题。不会做的话真是太丢人了。 一边听音乐,一边把代码撸出来了。听歌有时可以使注意...

  • 【不熟练】知识迁移能力-顺时针打印矩阵

    顺时针打印矩阵 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: ...

  • 《剑指offer》— JavaScript(19)顺时针打印矩阵

    顺时针打印矩阵 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: ...

  • 剑指offer——顺时针打印矩阵

    剑指offer——顺时针打印矩阵 题目描述: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,...

  • 矩阵

    题一:顺时针转圈打印矩阵 题二:“之“字形打印矩阵"之"字形打印矩阵两个指针:(sr,sc)先从第一行往右移动,到...

  • 《剑指offer》(十九)-顺时针打印矩阵(java)

    顺时针打印矩阵 考点:数组 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入...

  • 顺时针打印矩阵

    题目:顺时针打印矩阵(算法课第四课) 对于一个矩阵,请设计一个算法从左上角(mat[0][0])开始,顺时针打印矩...

  • 顺时针打印矩阵

    题目来源:牛客网--顺时针打印矩阵 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,...

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

    顺时针打印矩阵 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X ...

  • JZ-019-顺时针打印矩阵

    顺时针打印矩阵 题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X ...

网友评论

      本文标题:顺时针打印环形矩阵

      本文链接:https://www.haomeiwen.com/subject/opwajftx.html