这是给定的问题: 给定一个非负数表示为数字数组,
将数字加1(增加数字所代表的数字)。
存储数字,使最高位数位于列表的开头。
示例:
如果载体有[1,2,3]
返回的矢量应为[1,2,4]
为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;
}
}
但是,在测试用例中: 答:[0,6,0,6,4,8,8,1]
它说我的函数返回
6 6 4 8 8 2
正确的答案是
6 0 6 4 8 8 2
我不知道我的代码有什么问题。
谢谢!
答案 0 :(得分:8)
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后不会立即跳过该数字。
答案 1 :(得分:1)
更简单的做法
while (!result.isEmpty() && result.get(0).equals(0)) {
result.remove(0);
}
这将继续删除最左边的0,直到没有最多的零被删除。
答案 2 :(得分:1)
您的上一次for
循环正在从结果0
中删除ArrayList<Integer>
。删除该循环后,您将获得完美的输出
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;
}