关于数组的螺旋输出的实现,通过一个给定的M*N的二维数组,将数组内容通过螺旋的顺序输出。
本题在一次面试中,面试官通过屏幕共享方式让我当场编程,但是我没有写出来。
题目
有一个 m*n的数组
1 | int[][] array = { |
通过输出的方式,将数组的每一个数据按螺旋顺序输出,得到结果如下:
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 | //top = 0 表示将从二维数组array的第一层开始遍历 |
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 | top <= bottom |
java源码
1 | public class Test { |