https://www.nowcoder.com/practice/9b4c81a02cd34f76be2659fa0d54342a
    题目理解起来不难,考虑到了用边界,但只考虑到了用两个边界和起始点来定位,虽然可以通过大部分用例,但是例如一行多列的数组就会出现下边多次打印的bug,放弃了。

    1. public static ArrayList<Integer> printMatrix(int[][] matrix) {
    2. ArrayList<Integer> res = new ArrayList<>();
    3. //先排除特殊情况
    4. if(matrix.length == 0) {
    5. return res;
    6. }
    7. //左边界
    8. int left = 0;
    9. //右边界
    10. int right = matrix[0].length - 1;
    11. //上边界
    12. int up = 0;
    13. //下边界
    14. int down = matrix.length - 1;
    15. //直到边界重合
    16. while(left <= right && up <= down){
    17. //上边界的从左到右
    18. for(int i = left; i <= right; i++)
    19. res.add(matrix[up][i]);
    20. //上边界向下
    21. up++;
    22. if(up > down)
    23. break;
    24. //右边界的从上到下
    25. for(int i = up; i <= down; i++)
    26. res.add(matrix[i][right]);
    27. //右边界向左
    28. right--;
    29. if(left > right)
    30. break;
    31. //下边界的从右到左
    32. for(int i = right; i >= left; i--)
    33. res.add(matrix[down][i]);
    34. //下边界向上
    35. down--;
    36. if(up > down)
    37. break;
    38. //左边界的从下到上
    39. for(int i = down; i >= up; i--)
    40. res.add(matrix[i][left]);
    41. //左边界向右
    42. left++;
    43. if(left > right)
    44. break;
    45. }
    46. return res;
    47. }