🔍 题目描述
该题目来自于力扣66题加一

💡 解题思路拆解
1. 模拟手工加法(简单粗暴)
想象小学数学加法:从最低位开始加1,处理进位,直到最高位。
- 核心矛盾 :当某一位是
9
时,加1会变为0
并向前进位(如999 → 1000
)
🎯 代码实现(Go)
css
func plusOne(digits []int) []int {
digits[len(digits) - 1]++
digits = append([]int{0},digits...)
for i:=len(digits)-1;i>0;i--{
if digits[i] < 10{
break
}
digits[i] = 0
digits[i-1]++
}
if digits[0] == 0 {
digits = digits[1:]
}
return digits
}
2. 巧用逆向遍历
从数组末位向首位扫描,只需要找到末尾连续出现的9,全部置零,末尾开始的第一个不为 9 的元素 加1即可
分三种情况处理:
- 非9数字 :直接加1,结束计算(如
123 → 124
) - 是9但非全9 :置0,继续处理前一位(如
899 → 900
) - 全为9 :数组长度+1,首位置1(如
999 → 1000
)
🎯 代码实现(Go)
css
for i := len(digits); i > 0; i-- {
if digits[i-1] == 9 {
digits[i-1] = 0
if i == 1 && digits[i-1] == 0 {
digits = append([]int{1}, digits...)
}
} else {
digits[i-1]++
break
}
}
return digits
复杂度分析
- 时间复杂度:O(n) ,最多遍历一次数组
- 空间复杂度:O(1) ,原地修改(全9情况需O(n)额外空间)
互动话题:你在处理进位问题时踩过哪些坑?欢迎评论区分享!💬
🚀 坚持每日一题,小白也能稳步上升!