algorithm-base 数组篇:LeetCode 66「加一」——一次倒序遍历 + 取余判断,优雅处理全 9 进位
文档教程知识库【免费下载链接】algorithm-base一位酷爱做饭的程序员立志用动画将算法说的通俗易懂。我的面试网站 www.chengxuchu.com项目地址https://gitcode.com/gh_mirrors/al/algorithm-base点击查看免费下载本篇是 algorithm-base 仓库 数组篇 下的经典题目精讲围绕 LeetCode 66「加一Plus One」展开给定一个用数组表示的非负整数要求将其加一并以数组形式返回。读完本文你将掌握基于「倒序遍历 % 10取余」的单次遍历解法如何用同一段逻辑覆盖“无进位、有进位、全 9 进位”三种情况并理解该解法在 Java、Python、C、Swift、Go 五种语言下的等价实现以及时间、空间复杂度的准确分析。题目描述给定一个由整数组成的非空数组所表示的非负整数在该数的基础上加一。最高位数字存放在数组的首位数组中每个元素只存储单个数字你可以假设除了整数0之外这个整数不会以零开头。示例 1输入digits [1,2,3]输出[1,2,4]解释输入数组表示数字 123。示例 2输入digits [4,3,2,1]输出[4,3,2,2]解释输入数组表示数字 4321。示例 3输入digits [0]输出[1]题目解析加一只有三种情况我们思考一下加一的情况一共有几种是不是有以下三种情况特征例子结果第一种末位不是 9加一后不发生进位[1,2,3] → 123 1 124[1,2,4]第二种末位及若干低位是 9进位传递到中间某一位后停止[1,9,9] → 199 1 200[2,0,0]第三种所有位都是 9进位贯穿整个数组需要扩展一位[9,9,9] → 999 1 1000[1,0,0,0]那么我们应该根据什么来判断当前属于第几种情况呢答案是根据当前位「余 10」的结果来判断。对任意一位执行(digits[i] 1) % 10若该位是0~8加一取余后得到digits[i] 1结果不为 0说明进位到此为止属于第一、二种情况直接返回即可若该位是9加一取余后得到0说明产生了进位需要继续向左处理更高位若整个循环走完每一位都变成了 0说明属于第三种“全 9”情况此时只需申请一个长度len 1的数组、把首位置为1即可——因为新数组初始化后每一位天然都是 0。这个思路非常直观大家直接看代码吧很容易理解。核心解法数组遍历倒序 取余Java Codeclass Solution { public int[] plusOne(int[] digits) { //获取长度 int len digits.length; for (int i len-1; i 0; i--) { digits[i] (digits[i] 1) % 10; //第一种和第二种情况如果此时某一位不为 0 则直接返回即可。 if (digits[i] ! 0) { return digits; } } //第三种情况因为数组初始化每一位都为0我们只需将首位设为1即可 int[] arr new int[len1]; arr[0] 1; return arr; } }Python Codefrom typing import List class Solution: def plusOne(self, digits: List[int])-List[int]: # 获取长度 leng len(digits) for i in range(leng - 1, -1, -1): digits[i] (digits[i] 1) % 10 # 第一种和第二种情况如果此时某一位不为 0 则直接返回即可。 if digits[i] ! 0: return digits # 第三种情况因为数组初始化每一位都为0我们只需将首位设为1即可 arr [0] * (leng 1) arr[0] 1 return arrC Codeclass Solution { public: vectorint plusOne(vectorint digits) { for(int i digits.size() - 1; i 0; --i){ digits[i] (digits[i] 1)%10; if(digits[i]) return digits; } for(int x: digits) x 0; digits.emplace_back(1); reverse(digits.begin(), digits.end()); return digits; } };C 版本对“全 9”情况采用了不同的落点循环结束后数组所有位已全部为 0for清零循环在这里是防御性写法保证逻辑自洽随后emplace_back(1)在末尾追加1再reverse翻转使1回到首位得到[1, 0, 0, ...]。整个过程复用了原vector无需申请新容器。Swift Codeclass Solution { func plusOne(_ digits: [Int]) - [Int] { let count digits.count var digits digits for i in stride(from: count - 1, through: 0, by: -1) { digits[i] (digits[i] 1) % 10 if digits[i] ! 0 { return digits } } var arr: [Int] Array.init(repeating: 0, count: count 1) arr[0] 1 return arr } }Go Codefunc plusOne(digits []int) []int { l : len(digits) for i : l - 1; i 0; i-- { digits[i] (digits[i] 1) % 10 if digits[i] ! 0 { return digits } } digits append([]int{1}, digits...) return digits }Go 版本在“全 9”时使用append([]int{1}, digits...)把1拼到原切片头部生成[1, 0, 0, ...]语义上同样等价。复杂度与边界分析时间复杂度O(n)其中 n 为数组长度。最坏情况下如[9,9,...,9]需要从末位遍历到首位但仍是一次线性扫描空间复杂度O(1)除全 9 分支。第一、二种情况在原数组上就地修改并返回不申请额外空间第三种情况需要申请长度为len 1的新数组此时空间开销为 O(n)。C 版本通过复用vector做到了全场景 O(1) 额外空间边界 1单个元素。[0] → [1]属于第一种情况[9] → [1,0]属于第三种情况代码都能正确处理边界 2数字不以 0 开头。题目保证除0本身外不以零开头因此数组首位一定是1~9我们无需额外判断前导零取余技巧的本质(x 1) % 10对x ∈ [0,9]而言等价于“不进位则自增、为 9 则归零”恰好把“是否产生进位”的信息编码进了结果是否为0从而让三种情况共用同一套循环逻辑。在 algorithm-base 仓库中的定位与延伸本讲所在的 animation-simulation/数组篇 是 algorithm-base 仓库“数组篇”知识体系的一部分仓库 README.md 将该题归入「 数组篇」的动画模拟/绘图描述系列与 两数之和、移除元素、缺失的第一个正数、颜色分类 等题并列适合按数组专题顺序刷读。刷题过程中可搭配仓库的 Leetcode 常用类和函数 了解数组相关的length注意 Java 中数组长度属性后不加括号、Arrays.fill()、Arrays.sort()等高频工具加深对数组操作的理解。如果你想围绕“数字的逐位运算与进位”做延伸训练仓库中还有几个强相关的姊妹题链表求和面试题 02.05同样是逐位加法与进位但载体换成了链表且数位是反向存放的进位处理的思路与本篇高度互通缺失的第一个正数LeetCode 41同样需要在数组上进行原地重排与位置映射锻炼“数组即哈希表”的思维数组中重复的数字剑指 Offer 03利用数组下标与值的对应关系做原地判断属于同一类数组技巧的延伸。总结一句LeetCode 66 这道题虽然代码极短但“倒序遍历 % 10判断进位 全 9 兜底”的套路是数组题目里非常经典的一种模式吃透它你在处理任何“大数逐位运算”类问题时都会更有底气。赞分享文档教程知识库【免费下载链接】algorithm-base一位酷爱做饭的程序员立志用动画将算法说的通俗易懂。我的面试网站 www.chengxuchu.com项目地址https://gitcode.com/gh_mirrors/al/algorithm-base点击查看免费下载相关推荐LeetCode 66. Plus One加一题解数组反向遍历模拟加法与进位传播的完整解析LeetCode 66. Plus One加一题解数组反向遍历模拟加法与进位传播的完整解析 本文以 leetcode 仓库中的 problems/66.p文档教程知识库LeetCode 66. 加一Plus One题解反向遍历与进位传播的多语言实现LeetCode 66. 加一Plus One题解反向遍历与进位传播的多语言实现 本篇题解以 problems/66.plus one.md https:文档教程知识库LeetCode-Go 题解 66Plus One 的 Go 实现——数组逐位进位模拟与全 9 进位边界处理LeetCode Go 题解 66Plus One 的 Go 实现——数组逐位进位模拟与全 9 进位边界处理 本文以 LeetCode Go 仓库中第 66示例工程上一篇探索ZenML一款现代、可扩展的机器学习操作系统下一篇Standalone Migrations如何在非Rails项目中轻松管理数据库迁移创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

【Dv2Admin】字段根据下拉选项隐藏和显示字段

【Dv2Admin】字段根据下拉选项隐藏和显示字段

在数字化转型的浪潮中,学校的财务管理系统逐渐从传统的人工模式转向信息化、智能化的缴费方式。对于这样一个系统而言,用户界面(UI)与用户体验(UX)设计的优劣不仅直接影响到用户的操作便捷性,还关乎到整体的工作效率和错误率的降低。尤其是面对复杂的缴费种类和多样化的…

2026/9/24 13:34:12 阅读更多 →
【Dv2Admin】自由切换web前端路由的脚本

【Dv2Admin】自由切换web前端路由的脚本

在日常开发过程中,前端项目的不同环境(如开发、测试、正式环境)需要配置不同的API路由地址。每次手动更改配置文件可能会浪费大量时间,尤其是在项目频繁切换环境时。为了解决这个问题,可以通过Python脚本自动切换这些配置,简化操作流程,提升开发效率。 本文介绍了如何使…

2026/9/24 13:34:12 阅读更多 →
【Dv2Admin】页面切换tab操作按钮应用

【Dv2Admin】页面切换tab操作按钮应用

在构建现代Web应用时,选项卡式界面为用户提供了一种高效、紧凑的方式来在多个视图间导航。然而,错误的路由配置可能会导致重复的选项卡出现,并且页面上的某些功能(如操作按钮)无法正常使用。为了提升用户体验,开发者需要对Vue.js的路由系统有深入的理解,并正确应用它来避…

2026/9/24 13:34:12 阅读更多 →

最新新闻

纯电动汽车电平衡计算核心指南:从功率流到工程落地

纯电动汽车电平衡计算核心指南:从功率流到工程落地

简介:纯电动汽车电平衡计算.pdf 是一份面向新能源汽车整车电气设计及研发工程师的专业技术文献,聚焦电平衡这一关键环节,系统讲解整车用电负荷评估、蓄电池选型、DC/DC变换器匹配、熔断丝选择及导线线径计算,并给出夏季雨夜等严苛…

2026/9/24 23:39:28 阅读更多 →
WorkBuddy实战:桌面智能体如何帮你自动化整理本地文件

WorkBuddy实战:桌面智能体如何帮你自动化整理本地文件

第一次看到 WorkBuddy 这个名字的时候,我第一反应是:又一款套壳的 AI 聊天工具。说实话,这类产品这两年见得太多了,换个皮肤、接个大模型 API,就敢说自己是什么“效率神器”。但真正改变我判断的,是我把 Wo…

2026/9/24 23:39:28 阅读更多 →
YOLOv8姿态估计实现深蹲计数:从关键点检测到状态机实战

YOLOv8姿态估计实现深蹲计数:从关键点检测到状态机实战

简介:面向 NVIDIA Jetson 平台的 YOLOv8 姿势估计与运动计数演示项目,聚焦健身场景中的动作自动识别与计数,适合边缘计算、视觉 AI 开发者学习和二次开发。项目基于 YOLOv8-Pose 模型检测人体 17 个关键点,通过关键点连线夹角的阈…

2026/9/24 23:39:28 阅读更多 →
从对话到执行:WorkBuddy企业级办公自动化落地实战与踩坑盘点

从对话到执行:WorkBuddy企业级办公自动化落地实战与踩坑盘点

WorkBuddy这个词,最近在我身边的技术群里出现的频率确实高。最开始我以为又是一个套壳的聊天机器人,真正在自己的办公环境里跑了一圈之后,才发现它和我之前用过的AI助手有本质差异——它不是“回答问题”的,而是“把事办完”的。这…

2026/9/24 23:39:28 阅读更多 →
GD32H759+RT-Thread工控实战:I2C与RTC避坑指南

GD32H759+RT-Thread工控实战:I2C与RTC避坑指南

1. 从两个"看起来最简单"的外设说起在工控板卡上做开发,I2C 和 RTC 大概是那种"平时不出事、出事查半天"的模块。I2C 两根线,RTC 一颗纽扣电池,原理图上一画就完事,但真到 GD32H759 这种高性能 MCU 上跑 RT-T…

2026/9/24 23:39:28 阅读更多 →
x86电脑如何编译ARM程序:交叉编译原理与实操全解析

x86电脑如何编译ARM程序:交叉编译原理与实操全解析

“x86电脑能编译ARM程序”,这个标题我第一眼看到的时候,心里想的是:这不是基础得不能再基础的常识吗?后来发现问的人多了,才意识到很多朋友刚接触嵌入式或者ARM开发时,脑子里一直有个坎儿迈不过去——我用的…

2026/9/24 23:38:28 阅读更多 →

日新闻

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:19 阅读更多 →
单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:19 阅读更多 →
C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/24 0:00:19 阅读更多 →

周新闻

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

Flutter for OpenHarmony游戏卡片渐变背景实战:从原理到性能优化

直接铺开项目本身吧。这几个月我一直在折腾一件事:用Flutter给OpenHarmony做一款游戏集合类的App,说白了就是把若干小游戏塞进一个壳里,用统一入口分发。这个方向本身不算新鲜,真正让我花了不少心思的,是首页那堆游戏卡…

2026/9/24 14:34:13 阅读更多 →
Word表格编号全攻略:从列表编号到题注交叉引用

Word表格编号全攻略:从列表编号到题注交叉引用

写Word文档,最让人头疼的往往是那些“看起来不起眼”的小问题。比如表格编号这事:今天在表后面多加了两个空白行,明天给客户交稿前发现整个章节的编号全部错位,光是挨个改序号就能耗掉大半个下午。我前阵子帮人整理一份上百页的技…

2026/9/24 9:10:42 阅读更多 →
从第一个站到第二个站:独立开发者的静态网站选型与落地实践

从第一个站到第二个站:独立开发者的静态网站选型与落地实践

1. 项目概述1.1 核心需求解析做独立开发者这几年,说实话,第一个网站上线的那天晚上我兴奋得没睡着。但等它跑了半年,流量惨淡、功能臃肿、代码自己都懒得看第二遍之后,我才慢慢琢磨明白一个道理:第一个网站是练手&…

2026/9/24 14:33:56 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/24 12:50:34 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/24 14:33:48 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/24 12:49:17 阅读更多 →