顺时针打印矩阵

题目描述

输入一个矩阵,按照从外向里以顺时针的顺序依次打印每一个数字,例如,如果输入如下4*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. 因为一个二维平面,给定两个坐标(x1, y1)和(x2, y2)可以唯一确定一个矩阵。
  2. 然后可以通过圈子来打印对应的矩阵,然后缩小圈子完成整个过程即可。

图解过程

img

这个时候就打印出了1,2,3,4,8,12,16,15,14,13,9,5。

然后这个时候缩小圈子继续重复:

img

这个时候继续打印出6,7,11,10。然后全部拼接起来就是答案了。

代码

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
54
import java.util.ArrayList;

/**
* @author god-jiang
* @date 2020/1/17 20:58
*/
public class Solution {
static ArrayList<Integer> resList = new ArrayList<>();

public static ArrayList<Integer> printMatrix(int[][] matrix) {
//拿到左上角(x1, y1)和右下角(x2, y2)
int x1 = 0;
int y1 = 0;
int x2 = matrix.length - 1;
int y2 = matrix[0].length - 1;
//顺时针打印圈子的数值
while (x1 <= x2 && y1 <= y2) {
helpPrintMatrix(matrix, x1++, y1++, x2--, y2--);
}
return resList;
}

public static void helpPrintMatrix(int[][] matrix, int x1, int y1, int x2, int y2) {
if (x1 == x2) {
for (int i = y1; i <= y2; i++) {
resList.add(matrix[x1][i]);
}
} else if (y1 == y2) {
for (int i = x1; i <= x2; i++) {
resList.add(matrix[i][y1]);
}
//知道(x1, y1)和(x2, y2)可以确定一个矩阵
} else {
int curX = x1;
int curY = y1;
while (curY != y2) {
resList.add(matrix[x1][curY]);
curY++;
}
while (curX != x2) {
resList.add(matrix[curX][y2]);
curX++;
}
while (curY != y1) {
resList.add(matrix[x2][curY]);
curY--;
}
while (curX != x1) {
resList.add(matrix[curX][y1]);
curX--;
}
}
}
}

通过截图:

img

总结

如果你要是通过规律来顺时针打印矩阵的话会显得非常麻烦,我不是说不按照我的方法做不出来,只是会比较麻烦,coding能力较差的人可能会写不出来,但是把一个矩阵分解成多个圈子打印即可,打印单独写一个函数即可完成。

PS:觉得博主写的还可以的点点赞,关注走一波,谢谢大家的支持了~~~

-------------本文结束感谢您的阅读-------------

本文标题:顺时针打印矩阵

文章作者:god-jiang

发布时间:2020年01月17日 - 19:57:40

最后更新:2020年01月17日 - 21:27:00

原始链接:https://god-jiang.github.io/2020/01/17/顺时针打印矩阵/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

创作不易,您的支持就是我坚持的动力,谢谢大家!
0%