LeetCode-Go 题解 171:Excel Sheet Column Number(Excel 表列序号)的 26 进制还原解法 📅 发布时间:2026/9/13 17:51:28 👁 浏览次数: LeetCode-Go 题解 171Excel Sheet Column NumberExcel 表列序号的 26 进制还原解法【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go本篇技术指南以 LeetCode-Go 仓库中第 171 题题解文档为核心讲解如何把 Excel 列名称如 AB、ZY还原为对应的列序号给出可直接运行的 Go 实现、逐行原理分析、复杂度论证以及与互逆题 168 的对照读者阅读后可完全掌握 26 进制字符串转十进制的核心套路并复现本仓库的测试验证。题目描述原题英文题解文档要求给定一个 Excel 表格中的列名称column title返回其对应的列序号column number。Excel 的列命名规则如下先使用大写字母 A 到 Z 表示前 26 列用完后再在前面追加一位字母继续编号A - 1 B - 2 C - 3 ... Z - 26 AA - 27 AB - 28 ...官方示例示例 1Input: A Output: 1示例 2Input: AB Output: 28示例 3Input: ZY Output: 701题目小结题目本质可以归纳为一句话给定一个 Excel 列名称字符串返回其对应的列序号。注意输入保证是合法的列名称因此无需处理空串、小写字母或非法字符等边界情况这属于 LeetCode 中难度最低的一类直接模拟题目。解题思路按 26 进制还原成十进制本题的数学本质是进制转换。观察命名规律A - 1Z - 26即每一位字母X对应的数值是它在字母表中的位置从 1 开始可计算为X - A 1AA - 27可以写成1 × 26 1AB - 28可以写成1 × 26 2ZY - 701可以写成26 × 26 25。可以看到Excel 列名体系是一个以 26 为基数、但每一位的取值是 126 而非 025的特殊进制。处理方法是从左到右逐位读取每读入一位先把当前结果乘以 26相当于该位左侧已经确定的权重整体左移一位再加上当前字母的数值。这等价于把每一位字母转成数值后按权重累加result result * 26 (s[i] - A 1)原文档明确点出本题是第 168 题Excel Sheet Column Title的逆序题。168 题要求把列序号转换为列名称十进制转 26 进制而本题是把列名称还原为列序号26 进制转十进制两者互为逆运算可以对照学习。Go 源码实现与逐行解析仓库中的核心实现位于 171. Excel Sheet Column Number.go与原文档给出的代码完全一致package leetcode 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 }逐行拆解如下val, res : 0, 0val临时保存当前位字母对应的数值res为累计结果初始为 0。由于题目保证输入合法二者可以安全地初始化为零值。for i : 0; i len(s); i从高位最左侧向低位遍历整个列名称。len(s)在 Go 中对纯 ASCII 大写字母串即为字符个数且每次以s[i]取的是单个字节正好对应一个字母无需处理多字节 UTF-8 问题。val int(s[i] - A 1)利用 ASCII 码连续性把字母映射为 126。例如C - A 1 3Z - A 1 26。显式int()转换是为了让byte运算结果符合返回类型语义。res res*26 val核心累加式。读取新的一位时先把此前的结果左移一个26 进制位乘 26再加上当前位的数值。以ABC为例首轮res 0*26 1 1次轮res 1*26 2 28末轮res 28*26 3 731即1×26² 2×26 3。return res遍历结束后res即为最终列序号。正确性验证手工推演 ZY - 701轮次当前字符val s[i] - A 1res res*26 val1Z260 × 26 26 262Y2526 × 26 25 701结果与官方示例 3 完全一致。复杂度分析时间复杂度O(n)其中 n 为列名称字符串长度。算法只对字符串做一次线性扫描每次迭代执行常数次算术运算无嵌套循环。空间复杂度O(1)。仅使用两个整型局部变量val、res不依赖输入规模不申请任何与 n 相关的额外存储。对于 LeetCode 的约束列名称通常只有 17 位字符即使是最长的合法输入res的最大值也在 32 位整型可表示范围内不存在溢出风险。仓库源码与测试佐证单测用例仓库为本题提供了完整的表驱动测试见 171. Excel Sheet Column Number_test.go覆盖了官方三个示例并额外补充了一组用例输入期望输出A1AB28ZY701ABC731其中ABC - 731对应1×26² 2×26 3用于验证三位的 26 进制还原逻辑是对官方用例的有效补充。测试采用本仓库统一的question171/para171/ans171结构para171封装输入参数s stringans171封装期望答案one int。Test_Problem171依次遍历qs用例切片并调用titleToNumber(p.s)打印结果运行输出格式为------------------------Leetcode Problem 171------------------------ 【input】:A 【output】:1 【input】:AB 【output】:28 【input】:ZY 【output】:701 【input】:ABC 【output】:731本地运行与验证仓库根目录提供了 gotest.sh其核心命令为go test -covermodeatomic -coverprofilecoverage.txt ./leetcode/...单独验证本题只需运行go test -v ./leetcode/0171.Excel-Sheet-Column-Number/即可看到Test_Problem171的完整输入输出日志。项目声明的目标是 100% 测试覆盖率本题的线性实现配合上述表驱动用例可以完整覆盖所有代码分支每次迭代的赋值与累加、循环出口与返回语句。与第 168 题对照互逆的两道题本题文档明确指出它是 168. Excel Sheet Column Title 的逆序题。仓库中 168 题的实现位于 168. Excel Sheet Column Title.gopackage 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 题列序号 → 列名称十进制转 26 进制。注意这里用(n-1) % 26与(n-1) / 26巧妙地避开了每一位取值 126、没有 0与常规 025 进制之间的偏差这是处理 Excel 列号体系的关键细节。171 题列名称 → 列序号26 进制转十进制即本篇文章主题用res res*26 val逐位累加。例如convertToTitle(701)应返回ZY而titleToNumber(ZY)返回 701两者互逆闭环。建议把这两题放在一起练习可以一次性彻底掌握 Excel 列号这种1 基one-based26 进制的转换模型这也是面试中常被追问的变体题如扩展到任意基数的同类映射的基础。小结本题的解题要点可归纳为三条识别模型列名称本质是一个每一位取值范围为 126 的 26 进制数而不是常规的 025 进制递推公式res res*26 (s[i] - A 1)从左到右一次遍历即可完成还原时间 O(n)、空间 O(1)成对记忆与 168 题 互逆通过(n-1) % 26处理 1 基进制偏差两题对照可加深对进制转换本质的理解。完整的可运行源码、表驱动测试与中英文题解分别位于 题解源码、测试用例 与 题目 README可直接在本地运行验证。【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考