给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。
示例 2:
输入:digits = [4,3,2,1]
输出:[4,3,2,2]
解释:输入数组表示数字 4321。
示例 3:
输入:digits = [0]
输出:[1]
1.自己的解法。先根据尾数是不是9进行分别判断,如果尾数不是9,就不会产生进位,比较简单;如果是9,则向前遍历,一旦进位为0后,就退出循环。如果退出循环后还有进位,说明是从999...9加1成为1000...00的情况,用一个新的数组来表示该数字。
class Solution {
public int[] plusOne(int[] digits) {
int length = digits.length;
if(digits[length - 1] != 9){//尾数不为9的情况,直接将尾数加1
digits[length - 1]++;
return digits;
}
//尾数为9的情况,先对尾数进行计算,变成0,并且产生进位
int index = length - 1;
digits[index--] = 0;
int jinwei = 1;
while(index >= 0){//继续向前遍历
digits[index] += jinwei;//当前遍历到的数字加上进位
jinwei = 0;//进位被加后重置为0
if(digits[index] == 10){//如果加上进位还是10,则继续向前进位
digits[index] = 0;
jinwei = 1;
}else{//不是10,直接退出循环
break;
}
index--;
}
//如果还存在进位,说明是从999...9变成1000...00的情况,新创建一个数组
if(jinwei == 1){
int[] newdigits = new int[length + 1];
newdigits[0] = 1;
return newdigits;
}else{//不存在进位,直接输出
return digits;
}
}
}
2.其他人的解法:思想类似,但是可以只分成全为9和不全为9两种情况进行讨论。
代码来自评论@朴实的微笑
class Solution {
public int[] plusOne(int[] digits) {
//从后往前遍历数组
for (int i = digits.length - 1; i >= 0; i--) {
if (digits[i] != 9) {//遇到的数如果不是9,直接加1返回即可
digits[i]++;
return digits;
}
digits[i] = 0;//如果遇到的是9,说明产生进位,当前位是0,遍历的下一位加1
}
//跳出for循环,说明数字全部是9
int[] temp = new int[digits.length + 1];
temp[0] = 1;
return temp;
}
}
题源:力扣