2016-04-22 40 views
0

我想在Java中以螺旋順序打印2D數組列表。在任何時候,我都通過變量t,b,l,r(其含義在下面的代碼中給出)來標記arraylist遍歷和未遍歷的部分之間的界限。另外可變的目錄是我想要遍歷的方向。以螺旋順序打印2D數組列表indexOutOfBounds異常

dir=0(right),1(down),2(left),3(up). 

這裏是我的代碼:

public class Solution { 
    // DO NOT MODIFY THE LIST 
    public ArrayList<Integer> spiralOrder(final List<ArrayList<Integer>> a) { 
     ArrayList<Integer> result = new ArrayList<Integer>(); 
     // Populate result; 
     /* 
     * m=no. of rows, n=no. of cols, t=top row of untraversed list, b=bottom 
     * row of untraversed list, l=left most col of untraversed list and 
     * r=right most col of untraversed list 
     */ 
     int m = a.size(); 
     int n = a.get(0).size(); 
     int dir = 0; 
     int t = 0; 
     int b = m - 1; 
     int l = 0; 
     int r = n - 1; 
     while (l <= r && t <= b) { 
      if (dir == 0) { 
       for (int i = l; i <= r; i++) { 
        result.add(a.get(t).get(i)); 
        dir = 1; 
        t++; 
       } 
      } else if (dir == 1) { 
       for (int i = t; i <= b; i++) { 
        result.add(a.get(i).get(r)); 
        dir = 2; 
        r--; 
       } 
      } else if (dir == 2) { 
       for (int i = r; i >= l; i--) { 
        result.add(a.get(b).get(i)); 
        dir = 3; 
        b--; 
       } 
      } else if (dir == 3) { 
       for (int i = b; i >= b; i++) { 
        result.add(a.get(i).get(l)); 
        dir = 0; 
        l++; 
       } 
      } 

     } 
     return result; 
    } 
} 

任何人都可以點我在哪裏,我會犯錯? (我得到IndexOutOfBounds異常)

回答

0

更新變量t,l,r,b的一個小錯誤。 從左到右處理後,做一次t ++。目前我每次都更新我。 下面更新了代碼。希望這可以幫助。

  while(l<=r && t<=b){ 
       if(dir==0){ 
        for(int i=l; i<=r;i++){ 
         result.add(a.get(t).get(i)); 
        } 
        dir=1;t++; 
        } 

        else if(dir==1){ 
         for(int i=t;i<=b;i++){ 
          result.add(a.get(i).get(r)); 
         } 
         dir=2;r--; 
        } 
        else if(dir==2){ 
         for(int i=r;i>=l;i--){ 
          result.add(a.get(b).get(i)); 
         } 
         dir=3;b--; 
        } 
        else if(dir==3){ 
         for(int i=b;i>=t;i--){ // from bottom to top 
          result.add(a.get(i).get(l)); 
         } 
         dir=0;l++; 
        } 

      } 
0
else if(dir==3){ 
    for(int i=b;i>=b;i++){ 

我認爲它應該讀I> = T(從底部到頂部)。如果這不是它看堆棧跟蹤而這也正是數組越界

0

不知道如果我明白你的要求,但我認爲這個矩陣:

0, 1, 2, 3, 4, 5 
6, 7, 8, 9, 10, 11 
12, 13, 14, 15, 16, 17 
18, 19, 20, 21, 22, 23 
24, 25, 26, 27, 28, 29 
30, 31, 32, 33, 34, 35 
36, 37, 38, 39, 40, 41 

輸出是這樣的:

0, 1, 2, 3, 4, 5, 11, 17, 23, 29, 35, 41, 40, 39, 38, 37, 36, 30, 24, 18, 12, 6, 7, 8, 9, 10, 16, 22, 28, 34, 33, 32, 31, 25, 19, 13, 14, 15, 21, 27, 26, 20 

你的算法有點過於複雜。方向順序總是相同的:向右,向下,向左,向上。所以你可以一個接一個地寫下每個for而不用保留dir。

public ArrayList<Integer> spiralOrder(final List<ArrayList<Integer>> a) { 
    ArrayList<Integer> result = new ArrayList<>(); 
    int n = a.size(); 
    int m = a.get(0).size(); 
    for (int level = 0; level < Math.min(n, m)/2; level++) { 
     for (int i = level; i < m - level - 1; i++) { 
      result.add(a.get(level).get(i)); 
     } 
     for (int i = level; i < n - level - 1; i++) { 
      result.add(a.get(i).get(m - level - 1)); 
     } 
     for (int i = m - level - 1; i > level; i--) { 
      result.add(a.get(n - level - 1).get(i)); 
     } 
     for (int i = n - level - 1; i > level; i--) { 
      result.add(a.get(i).get(level)); 
     } 
    } 
    return result; 
} 
-1
else if (dir == 3) { 
    for (int i = b; i >= t; i--) { 
     result.add(a.get(i).get(l)); 
     dir = 0; 
     l++; 
    } 
}