LeetCode-Go 题解 66:Plus One 的 Go 实现——数组逐位进位模拟与全 9 进位边界处理
LeetCode-Go 题解 66Plus One 的 Go 实现——数组逐位进位模拟与全 9 进位边界处理【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go本文以 LeetCode-Go 仓库中第 66 题 Plus One 的题解文档为主线完整还原「用数组表示的非负整数加一」这道经典模拟题从原始题目约束、两个示例到文档给出的进位模拟思路与 Go 参考实现并结合仓库中的真实源码与测试用例剖析「中途进位终止」与「全 9 进位扩位」两条关键路径的处理方式帮助读者掌握原地修改数组完成大数加一的标准写法。题目描述LeetCode 66 题Plus One的原始描述见 题目文档Given anon-emptyarray of digits representing a non-negative integer, plus one to the integer. The digits are stored such that the most significant digit is at the head of the list, and each element in the array contain a single digit. You may assume the integer does not contain any leading zero, except the number 0 itself.仓库 中文题解 README 给出的题目大意给定一个由整数组成的非空数组所表示的非负整数在该数的基础上加一最高位数字存放在数组的首位即下标 0 是十进制数的高位数组中每个元素只存储单个数字0~9可以假设除了整数 0 之外这个整数不会以零开头。两个标准示例输入输出说明[1, 2, 3][1, 2, 4]数组表示整数 123[4, 3, 2, 1][4, 3, 2, 2]数组表示整数 4321这道题本质上是在考察大数加一的数组模拟不能把数组整体转成整数再做加法大数会溢出常规整型只能按十进制加法规则逐位处理。解题思路题解文档给出的核心思路Solution Approach给出一个数组代表一个十进制数数组的 0 下标是十进制数的高位要求计算这个十进制数加一以后的结果这是一道简单的模拟题从数组尾部开始往前扫逐位进位最高位如果还有进位即原数为全 9如999需要在数组第 0 位再插入一个1。整个过程对应两个阶段从低位向高位扫描每一位先加 1或者说先接收低位传来的进位若结果小于 10说明进位到此终止直接返回若结果等于 10将该位置 0 并继续向高位传递进位全 9 的特殊收尾如果一路进位到最高位仍未终止原数形如9、99、999加一后位数 1需要在最高位前补一个1。文档中的参考实现题解文档0066.Plus-One.md给出的 Go 实现如下package leetcode func plusOne(digits []int) []int { for i : len(digits) - 1; i 0; i-- { digits[i] if digits[i] ! 10 { // no carry return digits } // carry digits[i] 0 } // all carry digits[0] 1 digits append(digits, 0) return digits }逐行解读for i : len(digits) - 1; i 0; i--从最低位数组末尾向最高位下标 0遍历模拟手工竖式加法的进位方向digits[i]当前位加 1if digits[i] ! 10 { return digits }若加 1 后不满 10说明没有进位加一完成直接返回原地修改无需额外空间否则说明digits[i] 10执行digits[i] 0把进位留给下一轮循环处理循环全部执行完仍走到for之后说明每一位都是 9、全部产生进位如99加一得100此写法把原切片整体右移先digits[0] 1再append(digits, 0)等价于在最高位前插入 1 并在末尾补 0。仓库真实源码中的等价写法在 leetcode/0066.Plus-One/66. Plus One.go 中仓库实际提交的实现与文档版本逻辑等价但进位判断和扩位方式更直接package leetcode func plusOne(digits []int) []int { for i : len(digits) - 1; i 0; i-- { if digits[i] ! 9 { digits[i] return digits } digits[i] 0 } return append([]int{1}, digits...) }两个版本的差异点值得对照学习进位判定条件文档版先再判断 10仓库源码版先判断digits[i] ! 9再。两者语义一致——「当前位不是 9 时加 1 即可终止是 9 时置 0 并向高位进位」仓库源码版少了一次无意义的写回全 9 扩位方式文档版通过digits[0] 1; append(digits, 0)在原切片上平移仓库源码版使用append([]int{1}, digits...)直接在原数组前拼接[1]。两者最终结果相同例如[9, 9]均得到[1, 0, 0]后者代码意图更清晰但会触发一次长度为 n1 的新分配。从源码结构看两种写法都只在全 9 场景下才会产生新切片非全 9 的常规路径完全原地修改输入数组空间开销为 O(1)不算返回值本身。边界用例分析leetcode/0066.Plus-One/66. Plus One_test.go 定义了 4 组测试用例恰好覆盖了题目要求的全部边界qs : []question66{ { para66{[]int{1, 2, 3}}, ans66{[]int{1, 2, 4}}, }, { para66{[]int{4, 3, 2, 1}}, ans66{[]int{4, 3, 2, 2}}, }, { para66{[]int{9, 9}}, ans66{[]int{1, 0, 0}}, }, { para66{[]int{0}}, ans66{[]int{0}}, }, }用例考察路径说明[1, 2, 3]→[1, 2, 4]个位非 9直接终止题目示例 1最常见的中途终止路径[4, 3, 2, 1]→[4, 3, 2, 2]个位非 9直接终止题目示例 2验证多位数不受影响[9, 9]→[1, 0, 0]全 9 进位扩位验证「最高位仍有进位时插入 1」的分支[0]→[0]题目允许的唯一前导零验证单元素 0 加一后保持合法需要注意测试文件的断言方式Test_Problem66目前是以fmt.Printf打印输入与plusOne(p.one)的输出见测试文件第 52~55 行属于打印式冒烟测试而非assert式断言阅读或移植该测试时可自行补上t.Errorf对比期望值。复杂度分析与本地验证时间复杂度O(n)。中途终止的路径平均只扫描少数低位最坏情况全 9扫描全部 n 位且扩位需要 O(n) 的追加开销空间复杂度常规路径 O(1)原地修改全 9 路径需构造长度为 n1 的返回切片O(n)。本地验证方式仓库根目录Go 1.19见 go.mod# 运行第 66 题的测试 go test ./leetcode/0066.Plus-One/ -run Test_Problem66 -v # 运行仓库自带的覆盖率脚本生成 coverage.txt ./gotest.shgotest.sh 使用go test -covermodeatomic -coverprofilecoverage.txt ./leetcode/...对全部题解包生成单一合法的覆盖率 profile这也是仓库 README 中「100% test coverage」声明的支撑脚本。小结Plus One 虽属入门模拟题但它是「数组表示大数运算」类问题如 Add Binary、Multiply Strings的最小原型核心在于从低位到高位扫描、逐位处理进位、并在循环外单独处理最高位的溢出扩位。LeetCode-Go 仓库中该题的文档版实现与源码版实现分别展示了「先加再判」和「先判再加」两种等价风格配合 4 组覆盖常规/全 9/单元素 0 的测试用例可以作为学习原地数组模拟与 Go 切片追加惯用写法append([]int{1}, digits...)的完整参考。【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
上一篇/下一篇内容由系统自动关联
返回资讯列表 →