- 原理及遍历结果如图所示:

- 示例代码
private static List<Integer> spiralArray(int[][] array) {
// 数组为空,返回null
if (array.length == 0 || array[0].length == 0) {
return null;
}
// 获取循环遍历的次数,取行、列中的最小值的1/2
int temp = (Math.min(array.length, array[0].length) + 1) / 2;
List<Integer> results = Lists.newArrayList();
for (int item = 0; item < temp; item++) {
// 需要遍历的总列
int col = array[item].length - item;
// 需要遍历的总行
int row = array.length - item;
// 纵坐标,此时数据所在的列
int x = item;
// 横坐标,此时数据所在的行
int y = item;
// 从左往右遍历,此时纵坐标不变,横坐标依次递增,退出条件:y = col
for (; y < col; y++) {
results.add(array[x][y]);
}
// 从上往下遍历,此时横坐标不变,纵坐标依次递增。此时 y = col,数组的索引的起始值是0,故在使用y作为纵坐标的时候,y = y-1
for (x += 1; x < row; x++) {
results.add(array[x][y - 1]);
}
/**
* 从左往右遍历,此时纵坐标不变,横坐标依次递减
* 上面退出循环的条件时,x == row,而数组的索引的起始值是0,故在使用x作为纵坐标的时候,x = x-1
* 此时 y = col,纵坐标的索引的最大值为 col - 1,而在从上往下遍历元素的时候已经遍历了最右下角的元素,避免重复,故初始化 y = col - 1 -1;
*/
for (y = y - 2; y > item; y--) {
results.add(array[x - 1][y]);
}
/**
* 从下往上遍历,此时横坐标不变,纵坐标依次递减
* 上面退出循环的条件时,x == row,而数组的索引的起始值是0,故在使用x作为纵坐标的时候,初始化 x = x-1
* 在进行从左往右进行遍历的时候,已经对最左上角的元素进行了遍历,为了避免重复,所以纵坐标的结束条件为:遍历的次数+1
*/
for (x = x - 1; x >= item + 1; x--) {
results.add(array[x][y]);
}
}
return results;
}
本文介绍了一种螺旋方式遍历二维数组的方法,并提供了实现这一遍历逻辑的示例代码。通过定义循环次数和坐标变量,实现了从左到右、从上到下、从右到左、从下到上的四步遍历过程。
3653

被折叠的 条评论
为什么被折叠?



