背景杂谈
不知道为什么,可能脑袋一下放空了,一不小心就想到了大约2年前,在某个知名的宝典公司面试中,遇到了一道手撕代码题,和多年前的google的那道螺旋遍历数据有异曲同工之妙。现脑洞大开,想写下与大家分享下,解题思路可能不是很正确,欢迎大家建议和指正。
问题描述
有一个数组如下所示,现在需要遍历下,顺序为:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
1 | 2 | 6 | 7 | 14 |
---|---|---|---|---|
3 | 5 | 8 | 13 | 15 |
4 | 9 | 12 | 16 | 19 |
10 | 11 | 17 | 18 | 20 |
分析:咋一看,和那个螺旋数组挺像的,不过还是有些不一样的
求解思路
如下图所示:首先可以全部一个方向遍历所有的数据,然后把每一组遍历的结果加入list集合中。最后在list集合中,奇偶交错输出所有的数据就可以了。以上思路可能太直白了,应该有最优解,暂时没想到,欢迎大家留言交流。
代码示例
**
* 蛇形打印数组
* */
public static void printSnakeArrays(int [][] array){
//斜着遍历的每一行的数据集合
List<ArrayList> list = new ArrayList<>();
//临时数据
ArrayList temp;
int i=0,x,y;
for(int j=0;j<array[i].length;j++){
temp=new ArrayList();
temp.add(array[i][j]);
x=0;
y=j;
while ((x+1<array.length)&&(y-1>=0)){
temp.add(array[x+1][y-1]);
x++;
y--;
}
list.add(temp);
//竖着打印
if (j==array[i].length-1) {
for(int k=1;k<array.length;k++){
x=k;
y=j;
temp=new ArrayList();
temp.add(array[x][y]);
while ((x+1)<array.length&&(y-1>=0)){
temp.add(array[x+1][y-1]);
x++;
y--;
}
list.add(temp);
}
}
}
System.out.println("result:");
int index=0;
for(int m=0;m<list.size();m++){
index++;
if (index%2==0) {
System.out.println(list.get(m));
}else {
Collections.reverse(list.get(m));
System.out.println(list.get(m));
}
}
}
运行结果
[1]
[2, 3]
[4, 5, 6]
[7, 8, 9, 10]
[11, 12, 13, 14]
[15, 16, 17]
[18, 19]
[20]