文章目录
前言
今天搁小灰的公众号号发了一个螺旋遍历的面试题,既然是面试题那咱们肯定要做一下啊。然后小灰的文章里面有一点小bug,就是没有去除中心位置重复遍历的情况,然后我加了一些代码。最后我写出来和小灰代码不一样,但是思路一样的,大家可以看一哈,然后希望大家可以不吝赐教看看哪里还需要改进。
一、什么是螺旋遍历数组?
说白了就是从外往里,一圈一圈的对数组进行遍历,那么我们一起来看一下具体的实现过程吧。
我的执行流程是这样的,你也可以逆时针执行,然后执行完外圈之后,再往里进一步,再执行一圈,直至完全遍历。大家注意看我的箭头长度,这里的箭头长度代表每条边遍历时的值。
二、实现代码
class Solution {
public List<Integer> spiralOrder(int[][] matrix) {
List<Integer> list = new ArrayList<>();
//这里记住不要先设置变量,然后通过变量来判断长度是否为0,
//因为如果为空的时候,是得不到宽度的,会报错
if(matrix.length==0||matrix==null||matrix[0].length==0) {
return list;
}
int len = matrix.length;
int widlen = matrix[0].length;
for(int i=0;i<(Math.min(len,widlen)+1)/2;i++){
for(int j =i;j<widlen-i;j++){
list.add(matrix[i][j]);
}
for(int j=i+1;j<len-i;j++){
list.add(matrix[j][widlen-i-1]);
}
for(int j = widlen-i-2;j>=i;j--){
//防止出现重复遍历的情况
if(list.size()==len*widlen){
break;
}
list.add(matrix[len-i-1][j]);
}
for(int j = len - i-2;j>i;j--){
//防止出现重复遍历的情况
if(list.size()==len*widlen){
break;
}
list.add(matrix[j][i]);
}
}
return list;
总结
大家要是看不懂可以看一下《程序员小灰》的文章,虽然代码不一样,但是思路是一样的。也可以关注一下这个公众号真的很不错哦。