解决螺旋二维矩阵问题时 java 中令人困惑的异常越界错误

A confusing exception out of bound error in java while solving a spiral 2d matrix question

提问人:Debashis Baral 提问时间:9/2/2023 最后编辑:RobertDebashis Baral 更新时间:9/4/2023 访问量:34

问:

我正在解决这个问题,试图生成螺旋矩阵,但只有在矩阵的长度为奇数时才会反复出现错误。当长度均匀时,它工作正常

这是代码:

public class spiral {
    public static void main(String[] args) {
        int n = 5;
        generateSpiralMat(n);
    }

    static void generateSpiralMat(int n) {
        int[][] mat = new int[n][n] ;
        int topRow =0, rightCol = n-1, bottonRow = n-1, leftCol = 0 ;
        int num = 1 ;

        while( num < n*n + 1 ) {
            //topRow -> leftCol to rightCol
            for(int i=leftCol; i<rightCol; i++) {
                mat[topRow][i] = num;
                num ++ ;
            }

            //rightCol -> topRow to bottomRow
            for(int j =topRow; j<bottonRow; j++){
                mat[j][rightCol] = num ;
                num++ ;
            }

            //bottomRow -> rightCol to leftCol
            for(int i=rightCol; i> leftCol; i--) {
                mat[bottonRow][i] = num;
                num++ ;
            }

            //leftCol -> bottomRow to topRow
            for(int j=bottonRow; j>topRow; j--) {
                mat[j][leftCol] = num ;
                num ++ ;
            }

            topRow += 1 ;
            bottonRow -= 1 ;
            leftCol += 1 ;
            rightCol -= 1 ;
        }

        printMat(mat);
    }

    static void printMat(int[][] mat) {
        for(int i=0; i< mat.length; i++) {
            for(int j=0; j< mat[i].length; j++) {
                System.out.print( mat[i][j] + " ");
            }
            System.out.println();
        }
    }
}

偶数长度矩阵运行良好,但代码仅在运行时显示奇数长度矩阵的错误

我期望代码会根据给定的问题生成一个螺旋矩阵。

Java 矩阵 螺旋 数组索引OutofboundsException

评论

1赞 Ronald 9/2/2023
好吧,在您的生成函数中,在检查大小之前,您将增加 4。这适用于偶数的平方,因为它们可以被 4 整除。不过,奇数的平方不是。这意味着至少有一个值超出了有效范围numnum
1赞 user22471702 9/2/2023
提示:使用调试器单步执行代码...您将看到它大于第 59 行 () ||提示 2:同时执行两者时会发生什么,例如 if 和(下次请将异常添加为问题中的文本leftColrightColfor(int i=leftCol; i<rightCol; i++)leftCol += 1rightCol -= 1leftCol = 2rightCol = 3
0赞 user22471702 9/2/2023
顺便说一句,顶部和底部迟早也会发生同样的情况,代码将在不进入任何内部循环的情况下循环外部循环,直到由于整数溢出,限制 - 首先 - 交换为负 (leftCol-2147483648)

答:

1赞 Marce Puente 9/2/2023 #1
void spiral( int side ) {
   int matriz[][] = new int[ side ][ side ];
   int length = side * side;
   int count = 0;
   int top = side - 1;
   int floor = 0;
   int sector = 0;
   int j = 0, k = 0;
   for( int i = 0; i < length; i++ ) { 
      matriz[ j ][ k ] = count;
      switch( sector ) {
         case 3: j--;
            if( j == floor ) {
               sector = 0;
               top -= 1;
            }
            break;
         case 2: k--;
            if( k == floor ) {
               floor++;
               sector++;
            }
            break;
         case 1: j++;
            if( j == top ) {
               sector++;
            }
            break;
         case 0: k++;
            if( k == top ) {
               sector++;
            }
            break; 
      }
      count++;
   } 
}

我们将操作分为四个阶段:
A) 在列中前进 B) 在行中前进
C) 在列

中返回 D) 在达到相应限制
时返回行,它进入下一个扇区,在扇区“3”中修改上限,在“2”中修改下限。