开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第5天,点击查看活动详情
一、题目描述:
66. 加一 - 力扣(LeetCode) (leetcode-cn.com)
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 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 <= 1000 <= digits[i] <= 9
二、思路分析:
这道题我们按照以前学习数学的时候,模拟加法的思路来做是可以的,只不过,这里的一个数字固定为 1 而已,思路是从个位数开始依次往上加,加的时候注意进位即可,另外,为了防止最高位进 1,导致数组越界,所以,需要加一些特殊的判断。
三、AC 代码:
class Solution {
public int[] plusOne(int[] digits) {
int carry = 1;
for (int i = digits.length - 1; i >= 0; i--) {
int v = digits[i] + carry;
if (v == 10) {
digits[i] = 0;
carry = 1;
} else {
digits[i] = v;
carry = 0;
break;
}
}
if (carry == 0) {
return digits;
}
int[] newDigits = new int[digits.length + 1];
newDigits[0] = 1;
for (int i = 0; i < digits.length; i++) {
newDigits[1 + i] = digits[i];
}
return newDigits;
}
}
四、总结:
虽然是解出来了,但是我们还有优化的空间,其实,我们深入思考一下,什么情况下才有进位呢?
其实,只有当后面有连续的 9 的时候才会发生进位,因此,我们可以遍历的时候遇到后面连续的 9 就把它们改成 0, 直到遇到一个不是 9 的数,就可以返回了,当然,也是要特殊处理全部都是 9 的情况。