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

题目链接:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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 import java.util.ArrayList;
 2 public class Solution {
 3     public ArrayList<Integer> printMatrix(int [][] matrix) {
 4         ArrayList arrlist = new ArrayList<>();
 5         
 6         int tR = 0;//左上角行
 7         int tC = 0;//左上角的列
 8         int dR = matrix.length - 1;//右下角的行
 9         int dC = matrix[0].length - 1;//右下角的列
10         while (tR <= dR && tC <= dC) {
11             printEdge(matrix, tR++, tC++, dR--, dC--,arrlist);
12         }
13         return arrlist;
14     }
15     
16     public static void printEdge(int[][] m, int tR, int tC, int dR, int dC,ArrayList<Integer> arrlist) {
17         if (tR == dR) {//先判断是否只是一横行 如果是 打印该横行的列(通常用于内圈)
18             for (int i = tC; i <= dC; i++) {
19                 arrlist.add(m[tR][i]);
20             }
21         } else if (tC == dC) {//再判断是否只是一竖列 如果是 打印该横行的列(通常用于内圈
22             for (int i = tR; i <= dR; i++) {
23                 arrlist.add(m[i][tC]);
24             }
25         } else {
26             int curC = tC;//用2个变量储存 用于判断当前位置
27             int curR = tR;
28             while (curC != dC) {//当前位置未到达当前行的最右列 --》往右去
29                 arrlist.add(m[tR][curC]);
30                 curC++;
31             }
32             while (curR != dR) {//当前位置未到达当前列的最底行 --》往下去
33                 arrlist.add(m[curR][dC]);
34                 curR++;
35             }
36             while (curC != tC) {//当前位置未到达当前行的最左列 --》往左去
37                 arrlist.add(m[dR][curC]);
38                 curC--;
39             }
40             while (curR != tR) {
41                 arrlist.add(m[curR][tC]);
42                 curR--;
43             }
44         }
45     }
46     
47 }
原文地址:https://www.cnblogs.com/wangyufeiaichiyu/p/10860700.html