题目

顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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 2 3
4 5 6
7 8 9
输出并删除第一行后,变为
4 5 6
7 8 9
再进行一次逆时针旋转,就变成:
6 9
5 8
4 7
继续重复上述操作即可。

代码

  1. public static ArrayList<Integer> printMatrix(int [][] matrix) {
  2. ArrayList<Integer> list = new ArrayList<>();
  3. //拿到出事数组的行数
  4. int row = matrix.length;
  5. while(row != 0){
  6. //将数组的第一行先添加进容器中
  7. for(int i=0;i<matrix[0].length;i++)
  8. list.add(matrix[0][i]);
  9. //当行数等于1时就没有必要再继续执行了,在上面打印完之后就可以停止了
  10. if(row == 1)
  11. break;
  12. //删除上面遍历的数组的第一行,然后旋转这个数组并返回
  13. matrix = revert(matrix);
  14. //更新行数
  15. row = matrix.length;
  16. }
  17. //返回
  18. return list;
  19. }
  20. public static int[][] revert(int[][] matrix)
  21. {
  22. int rows = matrix.length;
  23. int cols = matrix[0].length;
  24. int[][] newMatrix = new int[cols][rows-1];
  25. for(int j=cols-1;j>=0;j--)
  26. {
  27. for(int i=1;i<rows;i++)
  28. {
  29. newMatrix[cols-j-1][i-1] = matrix[i][j];
  30. }
  31. }
  32. return newMatrix;
  33. }

方法二

分析

刷 LeetCode 看到的大神题解,感觉容易理解且好写
简单来说,就是不断地收缩矩阵的边界
定义四个变量代表范围,up、down、left、right

  1. 向右走存入整行的值,当存入后,该行再也不会被遍历,代表上边界的 up 加一,同时判断是否和代表下边界的 down 交错
  2. 向下走存入整列的值,当存入后,该列再也不会被遍历,代表右边界的 right 减一,同时判断是否和代表左边界的 left 交错
  3. 向左走存入整行的值,当存入后,该行再也不会被遍历,代表下边界的 down 减一,同时判断是否和代表上边界的 up 交错
  4. 向上走存入整列的值,当存入后,该列再也不会被遍历,代表左边界的 left 加一,同时判断是否和代表右边界的 right 交错

    代码

    ```java 链接:https://www.nowcoder.com/questionTerminal/9b4c81a02cd34f76be2659fa0d54342a?answerType=1&f=discussion 来源:牛客网

import java.util.ArrayList; public class Solution { public ArrayList printMatrix(int [][] matrix) { ArrayList list = new ArrayList<>(); if(matrix == null || matrix.length == 0 || matrix[0].length == 0){ return list; } int up = 0; int down = matrix.length-1; int left = 0; int right = matrix[0].length-1; while(true){ // 最上面一行 for(int col=left;col<=right;col++){ list.add(matrix[up][col]); } // 向下逼近 up++; // 判断是否越界 if(up > down){ break; } // 最右边一行 for(int row=up;row<=down;row++){ list.add(matrix[row][right]); } // 向左逼近 right—; // 判断是否越界 if(left > right){ break; } // 最下面一行 for(int col=right;col>=left;col—){ list.add(matrix[down][col]); } // 向上逼近 down—; // 判断是否越界 if(up > down){ break; } // 最左边一行 for(int row=down;row>=up;row—){ list.add(matrix[row][left]); } // 向右逼近 left++; // 判断是否越界 if(left > right){ break; } } return list; } } ```