我正在尝试在Java中以螺旋顺序打印2D arraylist。在任何时候,我通过变量t,b,l,r标记遍历和未遍历的arrayl部分之间的边界(其含义在下面的代码中给出)。变量dir也是我想要遍历的方向。
app.service('getName',function($http){
return {
getTheName: function() {
return $http({
url: 'hello.php',
method: 'Post',
headers: {
'Content-Type': 'application/json'
}
});
},
}
});
这是我的代码:
dir=0(right),1(down),2(left),3(up).
有人能指出我在哪里弄错了吗? (我得到IndexOutOfBounds异常)
答案 0 :(得分:1)
不确定我是否理解了您的要求,但我认为这个矩阵:
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
。
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 :(得分:0)
更新变量t,l,r,b时出现小错误。 从左到右处理后,执行t ++一次。目前每次都在使用i进行更新。 更新了以下代码。希望这会有所帮助。
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++;
}
}
答案 2 :(得分:0)
else if(dir==3){
for(int i=b;i>=b;i++){
我认为应该读取i&gt; = t(从下到上)。如果不是这样,它会查看堆栈跟踪以及哪个数组超出范围
答案 3 :(得分:0)
尝试更改:
else if(dir==3){
for(int i=b;i>=b;i++){
收件人:
else if (dir==3) {
for(int i=b; i>=t; i--){
答案 4 :(得分:-1)
else if (dir == 3) {
for (int i = b; i >= t; i--) {
result.add(a.get(i).get(l));
dir = 0;
l++;
}
}