1. 题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵:
1 2 3
4 5 6
7 8 9
依次打印出数字为:1 2 3 6 9 8 7 4 5
2. 题目分析
- 一个二维数组,让你按照顺时针的规则,将遍历的数字存入到一个数组中,然后return
- 设置4个变量:up、down、left、right,分别代表第一行、最后一行、第一列、最后一列
- 向右走存入整行的值,当存入后,该行再也不会被遍历,代表上边界的 up 加一,同时判断是否和代表下边界的 down 交错
- 向下走存入整列的值,当存入后,该列再也不会被遍历,代表右边界的 right 减一,同时判断是否和代表左边界的 left 交错
- 向左走存入整行的值,当存入后,该行再也不会被遍历,代表下边界的 down 减一,同时判断是否和代表上边界的 up 交错
- 向上走存入整列的值,当存入后,该列再也不会被遍历,代表左边界的 left 加一,同时判断是否和代表右边界的 right 交错
- 最后即可得到顺时针旋转的list
3. 题目代码
public class Matrix { public static void main(String[] args) { // int[][] a = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } }; int[][] a = { { 1 }, { 2 }, { 3 }, { 4 }, { 5 } }; /* * 1 2 3 4 5 */ ArrayList<Integer> list = new ArrayList<>(); list = printMatrix(a); for (int i = 0; i < list.size(); i++) { System.out.print(list.get(i) + " "); } } public static ArrayList<Integer> printMatrix(int[][] matrix) { ArrayList<Integer> list = new ArrayList<>(); int up = 0; int down = matrix.length - 1;// 代表的是行数 4 int left = 0; int right = matrix[0].length - 1;// 代表的是列数 1 while (up <= down && left <= right) { for (int i = left; i <= right; i++) { list.add(matrix[up][i]); } up++; if (up > down) { break; } for (int i = up; i <= down; i++) { list.add(matrix[i][right]); } right--; if (right < left) { break; } for (int i = right; i >= left; i--) { list.add(matrix[down][i]); } down--; if (up > down) { break; } for (int i = down; i >= up; i--) { list.add(matrix[i][left]); } left++; if (right < left) { break; } } return list; } }
4. 总结
- list的用法——JAVAlist的用法
- 二维数组的用法——JAVA二维数组的用法