news 2026/6/10 10:58:46

加1加1加1

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
加1加1加1

在日常开发或算法面试中,经常会遇到 “数字加一” 的场景 —— 但这里的数字并非简单的整数,而是用数组表示的(例如 [1,2,3] 代表 123)。这种场景看似简单,却暗藏边界陷阱,今天我们就来彻底拆解这个问题,从思路到代码一步步搞定。​

一、问题描述​

题目要求​

给定一个非负整数,以数组 digits 的形式呈现(数组中每个元素是单个数字,且不包含前导 0),对其执行 “加一” 操作,返回加一后的数组结果。​

示例说明​

输入​

输出​

说明​

[1,2,3]​

[1,2,4]​

123 + 1 = 124​

[9,9,9]​

[1,0,0,0]​

999 + 1 = 1000(数组扩容)​

[1,9,9]​

[2,0,0]​

199 + 1 = 200(进位传递)​

[0]​

[1]​

0 + 1 = 1(单个元素边界)​

二、核心思路分析​

1. 为什么从后向前遍历?​

加一操作的本质是 “从最低位开始计算”,而数组的最后一个元素恰好对应数字的最低位(例如 [1,2,3] 中 3 是个位)。因此,从数组末尾向前遍历是最符合直觉的选择。​

2. 进位处理的关键逻辑​

  • 若当前位数字 不是 9:直接加 1,此时无后续进位,直接返回结果(因为低位已处理完毕)。​
  • 若当前位数字 是 9:加 1 后会变成 0,且需要向高位进位,因此继续向前遍历处理下一位。​

3. 全 9 场景的边界处理​

如果遍历完所有元素都没有返回(说明数组中所有数字都是 9),此时需要创建一个新数组:首位为 1,后面拼接原数组(原数组已全部变为 0),例如 [9,9,9] → [1] + [0,0,0] = [1,0,0,0]。​

三、Python 完整代码实现(含注释)​

py取消自动换行复制

四、代码深度解析​

1. 遍历逻辑拆解​

py取消自动换行复制

  • len(digits)-1:数组最后一个元素的索引(最低位)。​
  • -1:遍历终止条件(不包含 -1,即遍历到索引 0)。​
  • -1:步长为 -1,实现从后向前遍历。​

2. 进位处理细节​

以 [1,9,9] 为例:​

  1. 遍历索引 2(数字 9):置为 0,继续向前。​
  1. 遍历索引 1(数字 9):置为 0,继续向前。​
  1. 遍历索引 0(数字 1):加 1 变为 2,返回 [2,0,0]。​

3. 全 9 场景的巧妙处理​

当数组全为 9 时,循环结束后 digits 已变为 [0,0,...,0],此时 [1] + digits 直接生成首位为 1、后续为 0 的新数组,无需额外判断。​

五、复杂度分析​

场景​

时间复杂度​

空间复杂度​

说明​

普通场景(非全 9)​

O(n)​

O(1)​

原地修改数组,无额外空间​

全 9 场景​

O(n)​

O(n+1)​

新建长度为 n+1 的数组​

  • 时间复杂度:最坏情况下需遍历整个数组(如全 9 场景),因此为 O (n)(n 为数组长度)。​
  • 空间复杂度:普通场景下原地修改,空间复杂度为 O (1);全 9 场景需新建数组,空间复杂度为 O (n)。​

六、扩展延伸(面试高频变种)​

1. 变种问题:数组实现 “加 k”(k 为任意正整数)​

原问题是 “加 1”,如果改为 “加 k”(例如 [1,2,3] + 45 → [1,6,8]),该如何修改?​

思路:​

  • 进位初始值设为 k,而非 1。​
  • 遍历数组时,当前位 = (原数字 + 进位) % 10,新进位 = (原数字 + 进位) // 10。​
  • 遍历结束后,若进位 > 0,将进位拆分为单个数字拼接到数组前面。​

代码实现:​

pyth取消自动换行复制

def plus_k(digits, k):​

carry = k # 进位初始值为 k​

for i in range(len(digits)-1, -1, -1):​

total = digits[i] + carry​

digits[i] = total % 10 # 当前位结果​

carry = total // 10 # 新进位​

if carry == 0: # 无进位时直接返回​

return digits​

# 处理剩余进位(如 carry=123 → [1,2,3])​

while carry > 0:​

digits.insert(0, carry % 10)​

carry = carry // 10​

return digits​

# 测试:[1,2,3] + 45 → [1,6,8]​

print(plus_k([1,2,3], 45)) # 输出 [1,6,8]​

# 测试:[9,9] + 3 → [1,0,2]​

print(plus_k([9,9], 3)) # 输出 [1,0,2]​

2. 变种问题:处理负数(数组表示负数加一)​

如果数组表示负数(例如 [-1,9,9] 代表 -199),加一操作后应为 -198(数组 [-1,9,8]),该如何处理?​

思路:​

  • 负数加一本质是 “减 1”(注意借位逻辑与加一相反)。​
  • 从末尾向前遍历,遇到非 0 的数字:减 1,返回结果。​
  • 遇到 0:变为 9,继续向前处理借位。​
  • 若所有位都是 0(如 [-1,0,0]),则变为 [-0,9,9] → 简化为 [-9,9](但需注意前导 0 处理)。​

七、总结​

数组加一问题的核心是 “进位处理” 和 “边界场景覆盖”:​

  1. 遍历方向:从后向前(符合数字计算逻辑)。​
  1. 核心逻辑:非 9 直接加 1 返回,9 则置 0 进位。​
  1. 边界处理:全 9 场景需数组扩容。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 21:25:47

回溯法:数据结构中“试错”的艺术回溯法

在数据结构与算法的世界里,有一类问题似乎天生带着“选择困难症”——组合求和、排列生成、子集划分……这类问题往往需要穷举所有可能的解,再从中筛选出符合条件的答案。而回溯法,正是解决这类问题的“金钥匙”,它以“试探 - 回溯…

作者头像 李华
网站建设 2026/6/10 7:08:24

如何用EmotiVoice克隆自己的声音并生成情感化语音?

如何用 EmotiVoice 克隆自己的声音并生成情感化语音? 在数字人、虚拟助手和游戏NPC日益普及的今天,用户早已不再满足于机械朗读式的语音输出。他们期待的是有情绪、有个性、像真人一样会“说话” 的交互体验。而要实现这一点,传统的文本转语音…

作者头像 李华
网站建设 2026/6/10 15:42:28

DownKyi:B站视频下载与批量处理完全攻略

DownKyi作为专为B站视频设计的全能下载工具,支持从标清到8K超高清的全方位画质下载,配合强大的批量处理能力和多媒体工具箱,为用户提供高效便捷的视频获取解决方案。 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频…

作者头像 李华
网站建设 2026/6/10 15:41:12

Wallpaper Engine下载器终极指南:简单3步批量获取创意工坊壁纸

Wallpaper Engine下载器终极指南:简单3步批量获取创意工坊壁纸 【免费下载链接】Wallpaper_Engine 一个便捷的创意工坊下载器 项目地址: https://gitcode.com/gh_mirrors/wa/Wallpaper_Engine 想要轻松获取Steam创意工坊中的精美动态壁纸吗?Wallp…

作者头像 李华
网站建设 2026/6/10 15:42:25

Windows搭建IOPaint超炫AI修图神器与远程使用

目录 ⛳️推荐 前言 【视频教程】 1.什么是IOPaint? 2.本地部署IOPaint 3.IOPaint简单实用 4.公网远程访问本地IOPaint 5.内网穿透工具安装 6.配置公网地址 7.使用固定公网地址远程访问 总结 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0…

作者头像 李华
网站建设 2026/6/10 17:14:11

3个步骤教你免费阅读付费墙后的优质内容

还在为付费墙阻挡而烦恼吗?优质文章总是被付费门槛拦住,让你无法获取心仪的内容?现在,一款创新的Chrome扩展工具能帮你解决这个困扰,让你轻松跨越内容付费障碍! 【免费下载链接】bypass-paywalls-chrome-cl…

作者头像 李华