有同事要进步头像

leecode每日一题 第66题:加1

解题思路

题目理解

给定一个非空数组 digits 表示一个非负整数(最高位在数组开头,每个元素是一位数字),要求给这个整数加 1,返回结果数组。

例如:

  • [1, 2, 3] → [1, 2, 4]

  • [1, 2, 9] → [1, 3, 0]

  • [9, 9, 9] → [1, 0, 0, 0]


核心思想:模拟「加 1」的进位过程

加 1 只发生在最低位(数组最后一位),然后可能产生连锁进位。所以从后往前遍历,逐位处理:

  1. 从数组最后一位开始,每次往前一步,直到下标 0

  2. 如果当前位 < 9:直接 +1,不会进位了,立即返回结果

  3. 如果当前位 == 9:+1 后变 10,本位变 0,进位交给下一位(循环的 i 自动往前走一位,去处理前一位)

  4. 如果循环走完还没返回:说明所有位原本都是 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

文章来源转载

评论

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--