Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 删除第一个元素的ArrayList_Java - Fatal编程技术网

Java 删除第一个元素的ArrayList

Java 删除第一个元素的ArrayList,java,Java,这是给定的问题: 给定一个表示为数字数组的非负数 数字加1(增加数字表示的数字) 存储数字时,最有效的数字位于列表的开头 例如: 如果向量有[1,2,3] 返回的向量应该是[1,2,4] as 123+1=124 这是我的代码: public class Solution { public ArrayList<Integer> plusOne(ArrayList<Integer> A) { int carry = 1;

这是给定的问题: 给定一个表示为数字数组的非负数

数字加1(增加数字表示的数字)

存储数字时,最有效的数字位于列表的开头

例如:

如果向量有[1,2,3]

返回的向量应该是[1,2,4]

as 123+1=124

这是我的代码:

 public class Solution {
    public ArrayList<Integer> plusOne(ArrayList<Integer> A) {       
        int carry = 1;
        int length = A.size();
        ArrayList result = new ArrayList();

        for( int i = length - 1; i >=0; i-- ){
            int val = A.get(i) + carry;
            result.add(0,val % 10);
            carry = val / 10;
        }

        if (carry == 1){
            result.add(0,1);
        }

        for (int j = 0; j < result.size(); j++){
            if(result.get(j).equals(0))
                result.remove(j);
            else
                break;
       }

        return result;

    }
  }
公共类解决方案{
公共阵列列表plusOne(阵列列表A){
整数进位=1;
int length=A.size();
ArrayList结果=新建ArrayList();
对于(int i=length-1;i>=0;i--){
int val=A.get(i)+进位;
结果。添加(0,val%10);
进位=val/10;
}
如果(进位==1){
结果:添加(0,1);
}
对于(int j=0;j
但是,在测试用例中: 答:[0,6,0,6,4,8,8,1]

它说我的函数返回

664882

而正确的答案是

6064882

我不知道我的代码出了什么问题

谢谢

if(result.get(j).equals(0))
    result.remove(j);
else
    break;
如果其他每个索引都包含0,则此操作将失败。下面是发生的情况:

0 6 0 6 4 8 8 2
^ (j = 0)
0将被删除,
j
增加1

6 0 6 4 8 8 2
  ^ (j = 1)
然后也会删除此0,跳过数组中的前6个。要解决此问题,请将代码段更改为:

if(result.get(j).equals(0))
    result.remove(j--);
else
    break;

这补偿了删除索引时的不足,因此
j
不会在删除任何0后立即跳过该数字。

简单一点

while (!result.isEmpty() && result.get(0).equals(0)) {
  result.remove(0);
}

这将继续删除最左边的0,直到没有更多的最左边的0可删除。

您的上次
for
循环正在从结果
数组列表中删除
0
。移除该循环后,您将获得完美的输出

public static ArrayList<Integer> plusOne(ArrayList<Integer> A) {       
    int carry = 1;
    int length = A.size();
    ArrayList result = new ArrayList();

    for (int i = length - 1; i >= 0; i--) {
        int val = A.get(i) + carry; //2 8
        result.add(0, val % 10);    // 2 8
        carry = val / 10;  
    }

    if (carry == 1) {
        result.add(0, 1);
    }

//  for (int j = 0; j < result.size(); j++) {
//      if (result.get(j).equals(0))
//          result.remove(j);
//      else
//          break;
//  }

    for (boolean isZero = true; isZero; ) {
        isZero = result.get(0).equals(0);

        if(isZero)
            result.remove(0);
    }

    return result;
}
publicstaticarraylistplusone(arraylista){
整数进位=1;
int length=A.size();
ArrayList结果=新建ArrayList();
对于(int i=length-1;i>=0;i--){
int val=A.get(i)+进位;//2 8
result.add(0,val%10);//2 8
进位=val/10;
}
如果(进位==1){
结果:添加(0,1);
}
//对于(int j=0;j
当j=0的值为0时会发生什么,j中没有元素--@Sanshai28(int j=0;j通过将其加回到0来解决这个问题。此外,后减量在减量之前返回
j
的值。i、 e.
j--
如果
j
最初等于0,则返回0,然后将-1存储到
j
。感谢您的提示!我认为这是一种在数组列表前消除重复项的更优雅的方法。学究式地说,假设函数总是接收带有非负整数的数组,在加1之后,你将永远不会有一个空数组,或者当它到达这个循环时将变为空。好吧,输入数组前面可能不应该有0个数字,并且应该包含一个非负数。如果按1加,则在结果之前几乎不可能有0个数字。@Nat我的评论并没有指责代码的完整性。事实上,我是在建议
!根据OP给出的规格,result.isEmpty()
是多余的。@PatrickRoberts我已经编辑了我的答案。。这是根据你的要求。。输出为:[6,0,6,4,8,8,2]