练习信:
给定一个mxn元素的矩阵(m行,n列),以螺旋顺序返回矩阵的所有元素。
例如,给定以下矩阵:
[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] You should return [1,2,3,6,9,8,7,4,5].
给定代码:
public class Solution { public List<Integer> spiralOrder(int[][] matrix) { } }
我的代码:
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++; for(int i = arriba; i <= abajo; i++) retorno.add(matrix[i][derecha]); derecha--; for(int i = derecha; i >= izquierda; i--) retorno.add(matrix[abajo][i]); abajo--; for(int i = abajo; i >= arriba; i--) retorno.add(matrix[i][izquierda]); izquierda++; if(izquierda >= derecha) return retorno; } } }
错误:
Runtime Error Message: Line 13: java.lang.ArrayIndexOutOfBoundsException: 1 Last executed input: [[1,2,3,4,5,6,7,8,9,10]]
有什么建议?我真的无法分辨出什么问题。为什么超出范围?锻炼可以在这里找到
我用此矩阵尝试了您的方法:
int[][] matrix = {{1,2,3}, {2,3,4}, {3,4,5}};
我什么也没得到ArrayIndexOutOfBoundsException。您的代码似乎没有引发任何错误。
ArrayIndexOutOfBoundsException
但是,我注意到输出不符合预期。它给我的输出是12345432(只有8个数字),缺少3矩阵中间的数字。
12345432
3
仔细查看您的代码后,我发现错误出在if(izquierda >= derecha)。如果将其更改为if(izquierda > derecha),则不会错过3。出于同样的原因,您还需要检查arriba > abajo,否则您的程序不适用于列多于行的任何矩阵。
if(izquierda >= derecha)
if(izquierda > derecha)
arriba > abajo
编辑: 每个for循环后都需要这些检查。
我建议您将return retorno;while循环移到外部,然后插入break检查中:
return retorno;
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,和izquierda:
arriba
derecha
abajo
izquierda
arriba 1 2 3 4 5 izquierda 2 3 4 5 6 derecha 3 4 5 6 7 abajo
这四个人可以看到前面的数字行:
1 2 3 4 5
5 6 7
3 4 5 6 7
1 2 3
只要将这些人前面的所有数字都添加到列表中retorno,他们就会向前跳一步。例如,在第一个for循环之后,它看起来像这样:
retorno
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
一旦这两个人中的 任何 一个经过彼此,您就会知道他们之间没有数字,因此您需要 立即 停止循环。这就是为什么您需要检查两个人是否每次 经过某个步骤 时 都经过对方(每个for循环之后)。