顺时针打印矩阵

Posted tu9oh0st

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了顺时针打印矩阵相关的知识,希望对你有一定的参考价值。

题目描述

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

分析

贴出代码

import java.util.ArrayList;
public class Solution {
    // new一个数组,以便下面函数能够调用
    ArrayList a = new ArrayList();
    public ArrayList<Integer> printMatrix(int [][] matrix) {
        int tR = 0;
        int tC = 0;
        int dR = matrix.length - 1;
        int dC = matrix[0].length - 1;
        // 左上边界最多到达右下边界,用于判断是否还是剥圈打印
        while (tR <= dR && tC <= dC){
            printEdge(matrix, tR++, tC++, dR--, dC--);
        }
        return a;
    }
    public void printEdge(int [][] m, int tR, int tC, int dR,int dC){
        // 先判断是否只是一横行,如果是,打印该横行的列(通常用于内圈)
        if (tR == dR){
            for (int i = tC; i <= dC; i ++){
                a.add(m[tR][i]);
            }
        } else if (tC == dC){ // 再判断是否只是一竖列,如果是,打印该横行的列(通常用于内圈)
            for (int i = tR; i <= dR; i++){
                a.add(m[i][tC]);
            }
        }else {
            // 用两个变量存储,用于判断当前位置
            int curC = tC; 
            int curR = tR;
            // 当前位置未到达当前行的最右列 --> 往右去
            while (curC != dC) {
                a.add(m[tR][curC]);
                curC ++;
            }while (curR != dR){ // 当前位置未到达当前列的最底行 --> 往下去
                a.add(m[curR][dC]);
                curR ++;
            }
            while (curC != tC){  // 当前位置未到达当前行的最左列 --> 往左去
                a.add(m[dR][curC]);
                curC --;
            }
            while (curR != tR){  // 当前位置未到达当前列的最顶行 --> 往上去
                a.add(m[curR][tC]);
                curR--;
            }
        }
    }
}

以上是关于顺时针打印矩阵的主要内容,如果未能解决你的问题,请参考以下文章

顺时针打印矩阵

剑指offer--29顺时针打印矩阵

剑指offer 19.顺时针打印矩阵

顺时针打印矩阵

剑指offer:顺时针打印矩阵

剑指 Offer 29. 顺时针打印矩阵 的 详细题解