LeetCode 第66题:加一
题目描述
给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。
难度
简单
题目链接
示例
示例 1:
输入:digits = [1,2,3] 输出:[1,2,4] 解释:输入数组表示数字 123,加 1 得到 124。
示例 2:
输入:digits = [4,3,2,1] 输出:[4,3,2,2] 解释:输入数组表示数字 4321,加 1 得到 4322。
示例 3:
输入:digits = [9] 输出:[1,0] 解释:输入数组表示数字 9,加 1 得到 10。
提示
1 <= digits.length <= 1000 <= digits[i] <= 9digits不含前导零
解题思路
从后向前遍历
这道题的关键是处理进位的情况。我们需要从数组末尾开始向前处理,如果遇到9需要进位,直到找到一个不是9的数字或者到达数组开头。
关键点:
- 从后向前遍历数组
- 处理进位情况
- 处理全是9的特殊情况
- 注意数组长度可能需要增加
具体步骤:
- 从最后一位开始向前遍历
- 如果当前位是9,置为0并继续向前
- 如果当前位不是9,加1并返回
- 如果全部都是9,需要创建新数组
图解思路
算法步骤分析表
| 步骤 | 操作 | 状态 | 说明 |
|---|---|---|---|
| 初始 | 输入 | [1,2,3] | 原始数组 |
| 末位加1 | 计算 | [1,2,4] | 无需进位 |
| 遇到9 | 进位 | [1,3,0] | 需要进位 |
| 全是9 | 新建 | [1,0,0,0] | 长度增加 |
状态/情况分析表
| 情况 | 输入 | 输出 | 说明 |
|---|---|---|---|
| 无进位 | [1,2,3] | [1,2,4] | 最简单情况 |
| 有进位 | [1,9,9] | [2,0,0] | 需要进位 |
| 全是9 | [9,9,9] | [1,0,0,0] | 长度增加 |
代码实现
C# 实现
public class Solution {
public int[] PlusOne(int[] digits) {
for (int i = digits.Length - 1; i >= 0; i--) {
// 如果当前位小于9,直接加1并返回
if (digits[i] < 9) {
digits[i]++;
return digits;
}
// 当前位是9,置为0,继续循环处理进位
digits[i] = 0;
}
// 如果执行到这里,说明所有位都是9
int[] result = new int[digits.Length + 1];
result[0] = 1;
return result;
}
}
Python 实现
class Solution:
def plusOne(self, digits: List[int]) -> List[int]:
# 从后向前遍历
for i in range(len(digits) - 1, -1, -1):
# 如果当前位小于9,直接加1并返回
if digits[i] < 9:
digits[i] += 1
return digits
# 当前位是9,置为0,继续循环处理进位
digits[i] = 0
# 如果执行到这里,说明所有位都是9
return [1] + [0] * len(digits)
C++ 实现
class Solution {
public:
vector<int> plusOne(vector<int>& digits) {
for (int i = digits.size() - 1; i >= 0; i--) {
// 如果当前位小于9,直接加1并返回
if (digits[i] < 9) {
digits[i]++;
return digits;
}
// 当前位是9,置为0,继续循环处理进位
digits[i] = 0;
}
// 如果执行到这里,说明所有位都是9
vector<int> result(digits.size() + 1, 0);
result[0] = 1;
return result;
}
};
执行结果
- 执行用时:152 ms
- 内存消耗:41.2 MB
代码亮点
- 🎯 简洁高效的实现
- 💡 巧妙处理进位情况
- 🔍 优雅处理全9的特殊情况
- 🎨 代码逻辑清晰
常见错误分析
- 🚫 没有处理全是9的情况
- 🚫 进位处理逻辑错误
- 🚫 返回数组长度错误
- 🚫 没有考虑数组为空的情况
解法对比
| 解法 | 时间复杂度 | 空间复杂度 | 优点 | 缺点 |
|---|---|---|---|---|
| 转整数 | O(n) | O(1) | 思路简单 | 可能溢出 |
| 字符串 | O(n) | O(n) | 容易理解 | 效率低 |
| 数组遍历 | O(n) | O(1) | 最优解法 | 需要处理进位 |