
LeetCode-Go 题解168. Excel Sheet Column Title — 用短除法实现 Excel 列号到列名的 26 进制字母编码【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go导读LeetCode 168 题要求把正整数转换为 Excel 工作表中的列名1 → A、27 → AA其本质是一个从 1 开始计数1-based的 26 进制编码问题与常规的 0-based 进制转换相比存在一个极易踩坑的偏移量。本文以 LeetCode-Go 仓库中该题的官方题解文档为核心结合 源码实现 与 单元测试完整推导短除法 余数逆序输出的解法并对比其互逆题 171 号帮助你彻底掌握这一类进制偏移问题的套路。题目描述给定一个正整数返回它在 Excel 表中相对应的列名称。例如1 - A 2 - B 3 - C ... 26 - Z 27 - AA 28 - AB ...示例 1Input: 1 Output: A示例 2Input: 28 Output: AB示例 3Input: 701 Output: ZY核心难点这不是普通进制转换如果套用普通的 10 进制转 26 进制0-based思路——不断n % 26取余、n / 26缩位——会遇到两个问题没有0这个字符26 个字母A~Z对应的是1~26而不是0~25。取余结果一旦为 0就没有字母与之对应。边界上的进位偏差26应输出Z27应输出AA。若用普通进制转换26 % 26 0会错误地映射到0位并产生错误的进位结果。正确做法是采用短除法short division每次取(n - 1) % 26作为余数再令n (n - 1) / 26把余数逆序拼接。减 1 的偏移操作正是 1-based 编码的关键它把值域[1, 26]整体平移到[0, 25]从而可以直接映射到字符A offset。以n 28为例手工推导一遍当前 n(n-1) % 26对应字母新 n (n-1) / 262827 % 26 1B27 / 26 110 % 26 0A0 / 26 0循环结束余数序列为B → A逆序后得到AB与预期一致。题解代码短除法 余数逆序原题解文档给出的 Go 实现如下见 题解文档package leetcode func convertToTitle(n int) string { result : []byte{} for n 0 { result append(result, Abyte((n-1)%26)) n (n - 1) / 26 } for i, j : 0, len(result)-1; i j; i, j i1, j-1 { result[i], result[j] result[j], result[i] } return string(result) }逐行源码剖析仓库中的实际实现与题解文档完全一致见 168. Excel Sheet Column Title.go核心只有两个阶段阶段一短除法求余数低位到高位for n 0 { result append(result, Abyte((n-1)%26)) n (n - 1) / 26 }(n-1) % 26把 1-based 余数映射到[0, 25]加上字符A的 ASCII 值后得到正确的大写字母字节(n-1) / 26完成缩位。之所以是(n-1)而非n是为了正确处理26 → Z这类整除边界注意n的合法范围为1 ≤ n ≤ 2147483647math.MaxInt32由于每次都先减 1 再运算循环体内部不会发生溢出这是该写法比先n--更安全的原因使用[]byte而非字符串拼接避免了每次操作产生新字符串的分配开销。阶段二逆序翻转for i, j : 0, len(result)-1; i j; i, j i1, j-1 { result[i], result[j] result[j], result[i] }由于短除法先产出的是低位个位字符需要原地双指针翻转把顺序纠正为高位在前。测试用例验证仓库的单元测试见 168. Excel Sheet Column Title_test.go采用了该仓库统一的表驱动测试结构para168封装输入参数nans168封装期望输出共覆盖 6 组用例输入 n期望输出1A28AB701ZY10011NUA999ALK681ZE这些用例覆盖了关键边界1最小值、28文档示例、701文档示例跨越ZZ进入三位列名、以及若干三位数中间值。其中701 → ZY恰好验证了整除边界后连续进位的正确性681 → ZE则验证了非整除情况。运行go test ./leetcode/0168.Excel-Sheet-Column-Title/即可复现全部断言。复杂度分析时间复杂度O(log₂₆ n)。每次循环n缩小约 26 倍加上一次线性翻转整体仍为对数级对int范围内的输入最多迭代约 7 次。空间复杂度O(log₂₆ n)用于存放余数字符的[]byte未引入额外递归栈。与互逆题 171. Excel Sheet Column Number 的对照本仓库还收录了该题的互逆问题——171. Excel Sheet Column Number列名转列号其实现为func titleToNumber(s string) int { val, res : 0, 0 for i : 0; i len(s); i { val int(s[i] - A 1) res res*26 val } return res }两题互为镜像构成了对 1-based 26 进制编码的完整理解168 题列号 → 列名从低位向高位拆解(n-1) % 26逐位取余再逆序171 题列名 → 列号从高位向低位累乘res*26 (s[i]-A1)逐位还原。对照记忆要点171 题在累乘时直接加s[i]-A1隐含 1-based与 168 题取余时的(n-1)偏移量一一对应。两道题在仓库 Math 题单 中均被归类为 Easy 难度是进制与数学变换类题目的入门代表作。常见易错点小结忘记减 1 偏移直接n % 26会在n 26时得到 0导致输出错误忘记逆序短除法得到的余数顺序是低位在前直接拼接会得到反向结果字符拼接效率在 Go 中应优先使用[]byte累积再一次性string()转换避免循环内反复字符串产生大量中间分配。总结Excel Sheet Column Title 这道题表面简单实际考察的是对**非零基进制bijective numeration**的理解。LeetCode-Go 仓库提供的短除法实现仅十余行却精准处理了整除边界、字符偏移与顺序翻转三个关键细节配合仓库内完整的表驱动测试用例是学习此类进制转换题目的标准范本。掌握了本解法与 171 题的互逆关系后你可以将其推广到 Excel 列索引、表格导出工具、电子表格公式解析等实际开发场景中。【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考