一尘不染

Java矩阵运行时错误

java

练习信:

给定一个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]]

有什么建议?我真的无法分辨出什么问题。为什么超出范围?锻炼可以在这里找到


阅读 168

收藏
2020-12-03

共1个答案

一尘不染

我用此矩阵尝试了您的方法:

int[][] matrix = {{1,2,3},
                  {2,3,4},
                  {3,4,5}};

我什么也没得到ArrayIndexOutOfBoundsException。您的代码似乎没有引发任何错误。

但是,我注意到输出不符合预期。它给我的输出是12345432(只有8个数字),缺少3矩阵中间的数字。

仔细查看您的代码后,我发现错误出在if(izquierda >= derecha)。如果将其更改为if(izquierda > derecha),则不会错过3。出于同样的原因,您还需要检查arriba > abajo,否则您的程序不适用于列多于行的任何矩阵。

编辑: 每个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;
}

代码说明(应要求提供):
假设您有一个矩阵,四个矩阵围在矩阵周围,每个人都在一侧。这四名个人被称为arribaderechaabajo,和izquierda

           arriba
          1 2 3 4 5
izquierda 2 3 4 5 6 derecha
          3 4 5 6 7
            abajo

这四个人可以看到前面的数字行:

  • arriba看到1 2 3 4 5
  • derecha看到5 6 7
  • abajo看到3 4 5 6 7
  • izquierda看到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 向右移动。

一旦这两个人中的 任何 一个经过彼此,您就会知道他们之间没有数字,因此您需要 立即 停止循环。这就是为什么您需要检查两个人是否每次 经过某个步骤
都经过对方(每个for循环之后)。

2020-12-03