2016-04-22 38 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++; 
    } 
}