我用这个矩阵尝试了你的方法:
int[][] matrix = {{1,2,3},
{2,3,4},
{3,4,5}};
我没有得到任何ArrayIndexOutOfBoundsException
。您的代码似乎没有抛出任何错误。
但是,我注意到输出并不符合预期。它给我的输出是12345432
(只有8个号码),缺少号码3
在矩阵的中间。
彻底查看您的代码后,我意识到错误在于if(izquierda >= derecha)
。如果你将其更改为if(izquierda > derecha)
它不会错过3
。出于与您执行此操作相同的原因,您还需要检查arriba > abajo
,否则您的程序不适用于任何列多于行的矩阵。
Edit:每次 for 循环之后都需要进行这些检查。
我建议你移动return retorno;
在 while 循环之外,并插入break
在检查中:
public List<Integer> spiralOrder(int[][] matrix) {
if(matrix == null || (matrix.length == 0))
return new ArrayList<Integer>();
int arriba = 0;
int derecha = matrix[0].length - 1;
int abajo = matrix.length - 1;
int izquierda = 0;
List<Integer> retorno = new ArrayList<Integer>();
while(true)
{
for(int i = izquierda; i <= derecha; i++)
retorno.add(matrix[arriba][i]);
arriba++;
if(arriba > abajo)
break;
for(int i = arriba; i <= abajo; i++)
retorno.add(matrix[i][derecha]);
derecha--;
if(izquierda > derecha)
break;
for(int i = derecha; i >= izquierda; i--)
retorno.add(matrix[abajo][i]);
abajo--;
if(arriba > abajo)
break;
for(int i = abajo; i >= arriba; i--)
retorno.add(matrix[i][izquierda]);
izquierda++;
if(izquierda > derecha)
break;
}
return retorno;
}
您的代码的说明(根据要求):想象一下,您有一个矩阵,四个人站在它周围 - 每个人站在一侧。这四个人被称为arriba
, derecha
, abajo
, and izquierda
:
arriba
1 2 3 4 5
izquierda 2 3 4 5 6 derecha
3 4 5 6 7
abajo
这四个人可以看到他们面前的一行数字:
-
arriba
sees 1 2 3 4 5
.
-
derecha
sees 5 6 7
.
-
abajo
sees 3 4 5 6 7
.
-
izquierda
sees 1 2 3
.
每当这些人前面的所有数字都添加到列表中时retorno
,他们向前跳跃了一步。例如,在第一个 for 循环之后,它看起来像这样:
1 2 3 4 5
arriba
izquierda 2 3 4 5 6 derecha
3 4 5 6 7
abajo
在整个 while 循环的第一次迭代之后,它们是这样的:
1 2 3 4 5
arriba
2 izquierda 3 4 5 derecha 6
abajo
3 4 5 6 7
-
arriba
正在向下移动。
-
derecha
正在向左移动。
-
abajo
正在向上移动。
-
izquierda
正在向右移动。
立刻any这两个人经过对方,你知道他们之间没有数字,你需要停止循环立即地。这就是为什么你需要检查两个人是否已经互相擦肩而过每次有人迈出了一步(在每个 for 循环之后)。