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。

代码实现

python 复制代码
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。

相关推荐
aichitang20241 小时前
Meta Muse Spark Open:816B 巨型开放权重多模态 Agent 模型架构、部署实战与社区首测全解
大数据·人工智能·python·算法·ai·架构·spark
小马不起床1 小时前
Django 后端实战指南_16:动作分类、动作库、动作收藏查询接口
数据库·python·django
ycydynq1 小时前
django搜索功能
数据库·python·django
Zella折耳根1 小时前
字符田字格绘制
python
SEO_juper1 小时前
手写 llms.txt 验证器:让 AI 更愿意引用你的网站(GEO)
开发语言·人工智能·python·聚类·seo·独立站
小小张说故事1 小时前
Python 的 list append 为什么是均摊 O(1)?拆开过度分配那张表,看容量翻倍背后的暗账
python
benjiangliu1 小时前
恩培趣味计算机视觉-01-conda环境和Python库
开发语言·python·conda
ZhengEnCi2 小时前
用 YOLOv8n + 自研二分类模型做课堂行为识别:从 9000 张标注数据到 Flask 全栈落地
pytorch·python·计算机视觉
成为深度学习高手2 小时前
xLSTM-Mixer:用标量记忆同时混合时间与变量,把循环网络带回多元时序预测
人工智能·python·深度学习·数据挖掘·transformer