剑指offer第十九题。

题目描述

题目描述
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下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.

解题思路

旋转打印有点难,不过也是有办法的。我们可以把矩阵想象为一个魔方,我读完第一行之后,我就把魔方左转90度,再读取第一行,这样循环,直到最后一行结束。具体看代码中注释。

我的答案

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
55
56
57
58
59
60
61
62
63
64

/**************************
用旋转魔方的方式,一直取出第一行;

例如

1 2 3
4 5 6
7 8 9
输出并删除第一行后,变为

4 5 6
7 8 9
再进行一次逆时针旋转,就变成:

6 9
5 8
4 7
继续重复上述操作即可。
***************************/
import java.util.ArrayList;
public class Solution {
public ArrayList<Integer> printMatrix(int [][] matrix) {
//作为存放结果的容器
ArrayList<Integer> list = new ArrayList<>();
//拿到出事数组的行数
int row = matrix.length;

while(row != 0){
//将数组的第一行先添加进容器中
for(int i=0;i<matrix[0].length;i++)
list.add(matrix[0][i]);
//当行数等于1时就没有必要再继续执行了,在上面打印完之后就可以停止了
if(row == 1)
break;
//删除上面遍历的数组的第一行,然后旋转这个数组并返回
matrix = revert(matrix);
//更新行数
row = matrix.length;
}

//返回
return list;
}

private int[][] revert(int[][] matrix){
//拿到matrix的行数和列数
int rows = matrix.length;
int cols = matrix[0].length;

//因为我们要将原数组遍历过的第一行删除,然后旋转变成一个新的数组,所以先初始化一下这个新数组
int[][] newMatrix = new int[cols][rows-1];

//对这个新数组进行赋值
for(int j=cols-1;j>=0;j--){
for(int i=1;i<rows;i++){
newMatrix[cols-j-1][i-1] = matrix[i][j];
}
}

//返回新数组
return newMatrix;
}
}