方法一
这版是自己的AC代码,记录一下。
首先用flag表示此刻是否有进位(当前位是否需要+1),初始置true。先假设最后答案数组位数与原数组位数相同,如果flag为真,说明当前位需要+1,即 res[i] = digits[i] + 1 ,如果+1后 res[i] == 10 ,说明需要进位,把res[i]置为0,flag置为true。否则res[i]不需要有变化,flag置为false。
最后判断结束后flag。如果为false直接返回res就可以了。但如果依然为true就说明一直都有进位,就是9999这种数。最开始我在if(flag)里面添加了每一位赋值的操作,让 newRes[i+1] = res[i] 。后面看了别人的题解,反应过来如果flag为真,说明答案是100000这种,末尾肯定都是0。所以直接给newRes[0]赋值为1即可,其它位都是初始化的0,就可以直接返回了。
class Solution {
public int[] plusOne(int[] digits) {
int len = digits.length;
boolean flag = true;
int res[] = new int[len];
for(int i = len - 1; i >= 0; i--) {
if(flag) {
res[i] = digits[i] + 1;
if(res[i] == 10){
res[i] = 0;
flag = true;
} else{
flag = false;
}
} else {
res[i] = digits[i];
}
}
if(flag) {
int newRes[] = new int[len + 1];
newRes[0] = 1;
return newRes;
} else{
return res;
}
}
}
方法二
评论区找到的最满意的一版题解。
直接判断加1前digits[i]是否为9,是的话就让它为0,继续循环。如果不为9,这里加上1后就可以结束了,直接返回digits数组。如果for循环结束还没有返回,说明给的数是9999这种一直走的if语句,那么就给数组扩容1个数并且重新初始化,把首位置为1,返回即可。
class Solution {
public int[] plusOne(int[] digits) {
int len = digits.length;
for(int i = len - 1; i >= 0; i--) {
if(digits[i] == 9) {
digits[i] = 0;
} else{
digits[i]++;
return digits;
}
}
digits = new int[len + 1];
digits[0] = 1;
return digits;
}
}