给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。
- 示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。 - 示例 2:
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
我的方案
思路
将数组末尾+1,然后解决末尾为9需要进位的问题。
算法
从末位开始+1,判断末位是否为10
- 不是10,表示没有碰触边界条件,直接返回数组
- 是10,从后向前开始循环整个数组,当digits[0]为10时,表示需要扩大数组,并以1为进位开头。否则将末尾开始迭代的当前位为10的更新为0,前一位再+1,直到数组结束。
代码
class Solution {
public int[] plusOne(int[] digits) {
int len = digits.length-1;
digits[len]+=1;
if(digits[len]!=10){
return digits;
}else{
for(int i =len;i>=0;i--){
if(i==0&&digits[i]==10){
int[] nums = new int[len+2];
nums[0]=1;
for(int j =0;j<digits.length;j++){
nums[j+1] = digits[j];
}
nums[1]=0;
return nums;
}
if(digits[i]==10){
digits[i] = 0;
digits[i-1] += 1;
}
}
}
return digits;
}
}
精选方案
思路
他这个思路和我的基本相同
算法
这个代码更简洁一些,直接在一个循环中遍历所有的位置,只要在循环中满足当前值取模不为零的条件即返回,一直没满足的话,意味着每一位都是9,那么直接返回1开头后面全为0。
代码
class Solution {
public int[] plusOne(int[] digits) {
for (int i = digits.length - 1; i >= 0; i--) {
digits[i]++;
digits[i] = digits[i] % 10;
if (digits[i] != 0) return digits;
}
digits = new int[digits.length + 1];
digits[0] = 1;
return digits;
}
}