Author: Muscle 2021-04-14 10:03:25 数组的螺旋输出

关于数组的螺旋输出的实现,通过一个给定的M*N的二维数组,将数组内容通过螺旋的顺序输出。
本题在一次面试中,面试官通过屏幕共享方式让我当场编程,但是我没有写出来。

题目

有一个 m*n的数组

1
2
3
4
5
6
7
8
int[][] array = {
{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}
}

通过输出的方式,将数组的每一个数据按螺旋顺序输出,得到结果如下:

1
{1,2,3,4,5,10,15,20,25,24,23,22,21,16,11,6,7,8,9,14,19,18,17,12,13}

java实现方式

具体实现步骤

1.定义四个变量 top,bottom,left,right
在执行程序的遍历之前,我们需要定义4个变量来检测二维数组array的四条边界,在每次碰到边界之后,收缩边界,并转向。

1
2
3
4
5
6
7
8
//top = 0 表示将从二维数组array的第一层开始遍历
int top = 0;
//bottom = array.length-1表示二维数组array层高为array.length-1,这个值是最低层所在的位置
int bottom = array.length-1;
//left = 0 表示遍历的初始位置,从左向右遍历
int left = 0;
//right = array[0].length-1表示取数组中第一个元素的长度减一,表示二维数组array的宽度
int right = array[0].length-1;

2.遍历第一条边 top
在第一次的遍历中,我们需要的输出为{1,2,3,4,5}
此时执行的顺序为

1
array[top][left] ==> array[top][right]

并且在执行完成之后

1
top++

表示最上的边已经遍历完成,在下次返回的时候,不会再经过第一层,而是在碰到第二层之后转向。

3.遍历第二条边 right
在上一次的遍历中,我们完成了第一条边的遍历,在这次遍历中,采取了同样的方法。
这一次,我们需要的输出为{5,10,15,20,25}
但是由于5这个数据在上一次的遍历中,完成了输出,所以这次需要省略。
此时的执行顺序为

1
array[top][right] ==> array[bottom][right]

并且在执行完成之后

1
right--

表示最右的边已经遍历完成,在下一次返回的时候,不会再经过最右层,而是在碰到它的左一层的时候转向。

4.遍历第三条边 bottom
同理,这个阶段需要的输出的内容为{25,24,23,22,21}
注意25已经出现过一次,这次遍历的时候不要扫描到第二次
此时的执行顺序为

1
array[bottom][right] ==> array[bottom][left]

并且在执行之后

1
bottom--

表示最底层已经遍历完成,在下一次返回的时候,不会再经过最底层,而是在碰到上一层的时候转向。

5.遍历第四条边 left
完成了上边三次遍历,这次也是一样。
预期输出{21,16,1,6,1}
注意21这个数字

执行顺序

1
array[bottom][left] ==> array[top][left]

因为

1
top++

所以这次的遍历会在层高为2的地方停止
所以1(array[0][0])这个数据不会出现

6.重复这四次遍历 直到所有的数据完成输出
需要用一个while语句将着四层遍历包裹起来
while的判断条件是所有的数据都已经输出
条件判断规则如下

1
2
3
top <= bottom
&&
left <= right

java源码

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
public class Test {
static int [][] array = {
{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}
};
public static void main(String[] args) {
display(array);
}
public static void display(int[][] arr){
int top = 0;
int left = 0;
int right = arr[0].length-1;
int bottom = arr.length-1;
while (top <= bottom && left <= right){
// from arr[top,left] To arr[top,right]
for(int i = left;i<=right;i++){
System.out.print(arr[top][i]+",");
}
++top;

//from arr[top,right] To arr[bottom,right]
for(int i = top;i<=bottom;i++){
System.out.print(arr[i][right]+",");
}
--right;

//from arr[bottom,right] To arr[bottom,left]
for(int i = right;i >= left;i--){
System.out.print(arr[bottom][i]+",");
}
--bottom;

//from arr[bottom,left] To arr[top,left]
for (int i = bottom;i >= top;i--){
System.out.print(arr[i][left]+",");
}
++left;
}
}
}
返回顶部