66. 加一
加一
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
示例 1:
输入:digits = [1,2,3]
输出:[1,2,4]
解释:输入数组表示数字 123。
示例 2:
输入:digits = [4,3,2,1]
输出:[4,3,2,2]
解释:输入数组表示数字 4321。
示例 3:
输入:digits = [9]
输出:[1,0]
解释:输入数组表示数字 9。
加 1 得到了 9 + 1 = 10。
因此,结果应该是 [1,0]。
class Solution {
public int[] plusOne(int[] digits) {
for (int i = digits.length - 1; i >= 0; i--) {
digits[i]++; // 1. 将当前位的数字加一
if (digits[i] == 10) { // 2. 如果加一后结果为 10
digits[i] = 0; // 将该位置为 0,并继续进位
} else {
return digits; // 3. 如果没有进位,直接返回结果
}
}
// 4. 如果循环结束,说明原数的每一位都产生了进位
digits = new int[digits.length + 1]; // 5. 创建一个新的数组,长度比原数组多一位
digits[0] = 1; // 6. 新数组的第一个元素置为 1,其它位置自然是 0
return digits; // 7. 返回新的数组
}
}
代码步骤解析
- 从末尾开始遍历:
- 我们从
digits
数组的最后一位(即最低位)开始逐步处理。这是因为我们要模拟加法操作,从个位开始加。
- 我们从
- 加一操作:
digits[i]++
将当前位的值加 1。如果加一后该位的值变为 10(即发生了进位),我们将当前位设置为 0,并继续处理上一位(即进位)。这就是通过digits[i] = 0
来模拟进位。
- 判断是否有进位:
- 如果当前位加 1 后不等于 10(即没有进位),说明加法完成了,直接返回结果。
- 处理所有位都进位的情况:
- 如果遍历到最后一位仍然发生了进位(即每一位都变成了 0),那么我们需要在最前面新增一个
1
,并将其余位设置为0
。这时就需要创建一个新的数组,长度比原数组多一位,并将1
放在数组的最前面。
- 如果遍历到最后一位仍然发生了进位(即每一位都变成了 0),那么我们需要在最前面新增一个