ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

LeetCode 504. Base 7 题解:Go 语言十进制转七进制的取余倒排实现

LeetCode 504. Base 7 题解:Go 语言十进制转七进制的取余倒排实现 LeetCode 504. Base 7 题解Go 语言十进制转七进制的取余倒排实现【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go导读本文围绕 LeetCode 第 504 题「Base 7七进制数」展开讲解如何将一个十进制整数转换为 7 进制字符串核心方法是反复除以 7 并收集余数最后倒序拼接。文章以 leetcode/0504.Base-7/README.md 为主体结合仓库内 504.Base 7.go 与 504.Base 7_test.go 的源码与测试进行印证读完你将掌握除基取余法的完整推导、负数与零等边界情况的处理技巧以及该解法在 Go 中的复杂度与可替代实现。题目描述给定一个整数num返回其 7 进制表示对应的字符串Given an integer num, return a string of its base 7 representation.。示例 1Input: num 100 Output: 202示例 2Input: num -7 Output: -10约束条件-10000000 num 10000000题目大意给定一个整数num将其转化为 7 进制并以字符串形式输出。示例中100的 7 进制为202即2*49 0*7 2 100负数-7则在正数转换结果10前加上负号得到-10。解题思路除基取余法原文档给出的解题思路非常凝练num 反复除以 7然后倒排余数。这本质上是进制转换中最通用的「除基取余division-remainder」算法适用于任意基数 B 的转换用num除以基数7得到商与余数将余数记录为当前最低位令num 商继续重复步骤 1直到商为 0将所有余数按从后往前的顺序拼接即从最高位到最低位得到最终结果。以num 100手工推演一遍与题目示例吻合轮次被除数除以 7 的商余数1100142214203202余数依次为[2, 0, 2]倒序排列得到202即最终答案。边界情况处理零与负数num 0直接返回0。若不加此特判循环条件num ! 0根本不会进入最终返回空字符串显然错误。这一步在 504.Base 7.go 中首先完成。num 0先记录负号标志negative true再将num取绝对值参与取余循环最后在结果前拼接-。这样避免了对负数直接取模时产生负余数保证每一位余数都落在[0, 6]区间内。以-7为例取绝对值7后余数依次为[0, 1]倒序得10加上负号即为-10。约束范围题目限定-10000000 num 10000000绝对值上限仅10^7远小于 Goint类型的表示范围因此-num取绝对值不存在溢出风险无需引入int64。代码实现以下为原文档给出的完整实现结合源码逐段解读package leetcode import strconv func convertToBase7(num int) string { if num 0 { return 0 } negative : false if num 0 { negative true num -num } var ans string var nums []int for num ! 0 { remainder : num % 7 nums append(nums, remainder) num num / 7 } if negative { ans - } for i : len(nums) - 1; i 0; i-- { ans strconv.Itoa(nums[i]) } return ans }代码要点说明取余循环remainder : num % 7收集余数num num / 7更新被除数二者配合完成「除基取余」的核心过程。Go 对正整数的除法向零截断因此循环必然在有限步内收敛到 0。倒序输出余数先入nums切片的是低位因此第二个循环从len(nums) - 1反向遍历将每位余数通过strconv.Itoa转为字符串后拼接得到从高位到低位的正确顺序。符号处理负号在倒序拼接之前先写入ans保证-出现在结果的最前端。仓库源码与测试印证实现文件仓库中的 504.Base 7.go 与 README 中给出的代码完全一致函数签名convertToBase7(num int) string位于leetcode包内是整个题解的唯一入口。测试用例504.Base 7_test.go 使用结构体question504内嵌para504与ans504组织测试数据覆盖了三种代表性场景输入num期望输出覆盖的分支100202正数、多位结果-7-10负数符号处理00零的特判测试在Test_Problem504中逐条执行一旦实际输出与期望不符立即调用t.Fatalf终止并报告错误504.Base 7_test.go。这三组用例恰好覆盖了函数中所有分支零特判、负数取绝对值、正常取余倒排具备良好的代码覆盖度。如何运行整个仓库使用标准 Go 测试框架模块定义见 go.mod可在仓库根目录执行以下命令运行全部 LeetCode 题解的测试go test ./leetcode/...若需生成覆盖率报告仓库根目录的 gotest.sh 提供了一键脚本以 atomic 模式输出单一合法的coverage.txt./gotest.sh单独验证本题可进入对应目录或直接指定包运行go test ./leetcode/ -run Test_Problem504 -v复杂度分析时间复杂度O(log₇|num|)。每次迭代num缩小为原来的 1/7迭代次数约为log₇|num|对于约束上限10^7而言最多约 9 轮效率极高。空间复杂度O(log₇|num|)。nums切片与最终字符串均需存储每一位余数/字符长度与迭代次数同阶。延伸标准库的替代实现除手写算法外Go 标准库strconv包也直接支持任意进制转换strconv.FormatInt(int64(num), 7)可将整数格式化为 236 进制的字符串且原生处理负号与零。例如strconv.FormatInt(100, 7) // 202 strconv.FormatInt(-7, 7) // -10 strconv.FormatInt(0, 7) // 0不过本题作为进制转换的入门题原文档选择手写「反复除以 7、倒排余数」的完整过程其教学价值在于让读者透彻理解取余、整除与符号拼接的底层原理而FormatInt适合在工程代码中追求简洁时直接使用。两种写法输出结果一致读者可自行对比体会。【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表