【剑指offer】-顺时针打印矩阵-19/67

1. 题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵:
1 2 3
4 5 6
7 8 9

依次打印出数字为:1 2 3 6 9 8 7 4 5

2. 题目分析

  1. 一个二维数组,让你按照顺时针的规则,将遍历的数字存入到一个数组中,然后return
  2. 设置4个变量:up、down、left、right,分别代表第一行、最后一行、第一列、最后一列
  3. 向右走存入整行的值,当存入后,该行再也不会被遍历,代表上边界的 up 加一,同时判断是否和代表下边界的 down 交错
  4. 向下走存入整列的值,当存入后,该列再也不会被遍历,代表右边界的 right 减一,同时判断是否和代表左边界的 left 交错
  5. 向左走存入整行的值,当存入后,该行再也不会被遍历,代表下边界的 down 减一,同时判断是否和代表上边界的 up 交错
  6. 向上走存入整列的值,当存入后,该列再也不会被遍历,代表左边界的 left 加一,同时判断是否和代表右边界的 right 交错
  7. 最后即可得到顺时针旋转的list

3. 题目代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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. 总结

  1. list的用法——JAVAlist的用法
  2. 二维数组的用法——JAVA二维数组的用法
打赏
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2017-2020 苦酒
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信