解题思路
题目理解
给定一个非空数组 digits 表示一个非负整数(最高位在数组开头,每个元素是一位数字),要求给这个整数加 1,返回结果数组。
例如:
-
[1, 2, 3]→[1, 2, 4] -
[1, 2, 9]→[1, 3, 0] -
[9, 9, 9]→[1, 0, 0, 0]
核心思想:模拟「加 1」的进位过程
加 1 只发生在最低位(数组最后一位),然后可能产生连锁进位。所以从后往前遍历,逐位处理:
-
从数组最后一位开始,每次往前一步,直到下标 0
-
如果当前位 < 9:直接
+1,不会进位了,立即返回结果 -
如果当前位 == 9:
+1后变 10,本位变0,进位交给下一位(循环的i自动往前走一位,去处理前一位) -
如果循环走完还没返回:说明所有位原本都是 9,全部变成了 0,此时在数组最前面补一个 1(长度 +1)
关键点:进位如何传播?
不要手动去改 digits[i-1],而是让 for 循环的 i 自动往前走来完成进位:
-
遇到 9 → 当前位变 0 → 循环继续 →
i自动减 1 → 下一次循环就处理前一位 -
前一位如果 < 9 →
+1返回;如果又是 9 → 变 0 继续往前
这样进位是「天然」传播的,不需要写死 i-1。
代码实现
class Solution:
def plusOne(self, digits: list[int]) -> list[int]:
l = len(digits)
#从最后一个开始遍历,到第1个完成,每一次都只-1;
for i in range(l - 1,-1,-1):
if digits[i] < 9:
digits[i] = digits[i] + 1
return digits
digits[i] = 0
return [1] + digits
#从数组的最后一个遍历,每一次都往前一步,直到数组【0】;
#如果当前的数值小于9的话,直接+1
#如果当前的数值大于9的话,直接变成0,然后下一次循环时,就直接将i-1的位置数值直接+1,最后返回,考虑到如果数组中的元素都是9的话,就直接在数组的最前面+1,因为原本数组中的所有的数值都已经变成了0。
执行流程演示
例 1:[1, 2, 3]
text
i=2: digits[2]=3 < 9 → 3+1=4 → return [1,2,4] ✅
例 2:[1, 2, 9]
text
i=2: digits[2]=9 不<9 → 变0 → [1,2,0] i=1: digits[1]=2 <9 → 2+1=3 → return [1,3,0] ✅
例 3:[9, 9, 9]
text
i=2: 9 → 变0 → [9,9,0] i=1: 9 → 变0 → [9,0,0] i=0: 9 → 变0 → [0,0,0] 循环结束 → return [1] + [0,0,0] = [1,0,0,0] ✅
复杂度分析
-
时间复杂度:
O(n),最坏情况(全是 9)遍历整个数组一次 -
空间复杂度:
O(1)(原地修改;只有全 9 时[1] + digits需要O(n)新数组,属于返回结果本身的开销)
易错点总结
| 易错点 | 错误写法 | 正确做法 |
|---|---|---|
| 只特判最后一位 | 只写 if digits[-1] < 9 | 必须用循环处理连锁进位 |
| 手动进位到前一位 | digits[i-1] += 1 | 只写 digits[i] = 0,让 i 自动往前 |
| 前一位是 9 没继续进位 | [1,9,9] 得 [1,10,0] | 循环会自然处理 |
| 忘记全 9 的情况 | [9,9] 得 [0,0] | 循环外 return [1] + digits |
return 缩进错 | return 写在 for 里 | 放进 if 分支(提前返回)或循环外 |
| 越界 | [9] 时访问 digits[-1] 乱改 | 不要手动访问 i-1 |
一句话记忆
从后往前扫,遇 <9 就 +1 返回;遇 9 就变 0 继续往前;扫完全都是 9,最前面补个 1。
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/Yyyyyts/article/details/168454733



