题目
加一 给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 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 <= digits.length <= 100
0 <= digits[i] <= 9
题解
解题分析
解题思路
- 我们对数加 1 的时候,我们只需要考虑
digits
末尾有多少个 9 。分为 3 种情况。
- 如果
digits
末尾没有9 ,比如:[1,2,3] 我们直接加一,得到 [1,2,4] 返回; - 如果
digits
末尾有若干个9 ,比如:[1,2,3,9,9] 我们需要找到末尾第一个不为9的元素,即3,对该元素加1,得到 [1,2,4,9,9], 然后将后续的元素都设置为 0 ,返回[1,2,4,0,0] 返回; - 如果
digits
所有的元素都是 9 ,比如:[9,9,9,9,9] 我们需要返回 [1,0,0,0,0] 。其实我们只需要构造一个 digits.length + 1 长度的数组,然后设置第一个元素为 1 即可,其余元素为 0.
- 算法实现的话,我们可以直接逆序访问数组,查找第一个不为 9 的元素,如果找到下标为 i ,将 i +1 < digits.length -1, 的元素设置为 0 ,然后返回。极端情况下,如果所有的元素都为 9 。我们需要创建一个新的数组,数组长度为 digits + 1,设置第一个元素为1 返回。
复杂度
- 时间复杂度 O(N)
- 空间复杂度 O(N)
解题代码
题解代码如下(代码中有详细的注释说明):
class Solution {
public int[] plusOne(int[] digits) {
int n = digits.length;
// 下标从大到小
for (int i=n-1; i>=0; --i) {
// 是否为 9
if (digits[i] != 9) {
// + 1
++digits[i];
// 下标高位部分为 9, 表示数值低位为 9,需要进位
// 进位后,覆盖数组下标的值,且数值为 0
for (int j = i + 1; j < n; ++j) {
digits[j] = 0;
}
return digits;
}
}
// 其他的全部为 9
int[] ans = new int[n + 1];
ans[0] = 1;
return ans;
}
}
提交后反馈结果如下:
参考信息
- 力扣 66. 加一