1. 问题描述与理解
"加一"是LeetCode题库中编号第66题的一道经典数组操作题目。题目要求非常简单:给定一个由非负整数组成的非空数组,其中每个元素代表一个数字的一位,数组整体表示一个非负整数。我们需要对这个整数执行加一操作,并返回结果数组。
举个例子:
- 输入 [1,2,3] 表示数字123,加一后返回 [1,2,4]
- 输入 [4,3,2,1] 表示4321,加一后返回 [4,3,2,2]
- 输入 [9] 表示9,加一后返回 [1,0]
这个看似简单的问题实际上考察了几个关键点:
- 数组的基本操作能力
- 对数字进位机制的理解
- 边界条件的处理(特别是最高位进位的情况)
- 代码的简洁性和效率
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 解题思路分析
2.1 常规思路解析
最直观的解法是从数组末尾开始向前遍历,模拟手工加法的过程:
- 从最后一位开始加1
- 如果当前位加1后小于10,则直接返回结果
- 如果等于10,则当前位设为0,并向前一位进位
- 如果遍历完所有位仍有进位,则在数组最前面插入1
这种思路的时间复杂度是O(n),其中n是数组长度。在最坏情况下(如999...9),需要遍历整个数组并可能增加一位。
2.2 特殊情况考虑
这道题有几个需要特别注意的边界情况:
- 普通不进位情况:[1,2,3] → [1,2,4]
- 中间进位情况:[1,2,9] → [1,3,0]
- 连续进位情况:[1,9,9] → [2,0,0]
- 全9进位情况:[9,9,9] → [1,0,0,0]
提示:在编写代码时,建议先用这些测试用例验证你的解法是否正确。
2.3 算法优化思考
虽然这道题的常规解法已经很高效,但我们还可以考虑一些优化方向:
- 提前终止:当没有进位时可以直接返回结果,避免不必要的遍历
- 空间优化:尽量避免使用额外空间,直接在原数组上操作
- 数学方法:将数组转换为数字计算后再转回数组(不推荐,因为大数会溢出)
3. 代码实现与解析
3.1 Python实现
python复制def plusOne(digits):
n = len(digits)
for i in range(n-1, -1, -1):
if di
