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.)。
示例 1:
Input: num = 100 Output: "202"示例 2:
Input: 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 的商 | 余数 |
|---|---|---|---|
| 1 | 100 | 14 | 2 |
| 2 | 14 | 2 | 0 |
| 3 | 2 | 0 | 2 |
余数依次为[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 | 期望输出 | 覆盖的分支 |
|---|---|---|
100 | "202" | 正数、多位结果 |
-7 | "-10" | 负数符号处理 |
0 | "0" | 零的特判 |
测试在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)可将整数格式化为 2~36 进制的字符串,且原生处理负号与零。例如:
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),仅供参考