171. Excel 表列序号
171. Excel 表列序号
题目链接(简单)
题目描述
给你一个字符串 columnTitle,表示 Excel 表格中的列名称。返回该列名称对应的列序号。
例如:
A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28
...数据范围:
1 <= columnTitle.length <= 7columnTitle仅由大写英文字母组成columnTitle在范围["A", "FXSHRXW"]内
示例
示例 1:
输入: columnTitle = "A"
输出: 1
示例 2:
输入: columnTitle = "AB"
输出: 28
示例 3:
输入: columnTitle = "ZY"
输出: 701
核心思路
Excel 列名称本质上是一个 26 进制 表示,但和普通 26 进制的区别是:
- 普通 26 进制:数字范围是
0 ~ 25; - Excel 列名称:数字范围是
1 ~ 26,其中A = 1,B = 2,…,Z = 26。
例如 "AB":
A = 1
B = 2
AB = 1 * 26 + 2 = 28再如 "ZY":
Z = 26
Y = 25
ZY = 26 * 26 + 25 = 701因此可以从左到右遍历字符串,维护当前结果:
res = 0
for ch in columnTitle:
res = res * 26 + (ord(ch) - ord('A') + 1)方法一:从左到右迭代(推荐)
思路及解法
从左到右扫描每个字符:
- 当前字符对应的数值为
ord(ch) - ord('A') + 1; - 把之前累计的结果乘 26,再加上当前字符的数值;
- 遍历结束后,
res就是答案。
举例:columnTitle = "AB"
| 步骤 | 字符 | 字符值 | 计算 | res |
|---|---|---|---|---|
| 初始 | — | — | — | 0 |
| 1 | 'A' |
1 | 0 * 26 + 1 |
1 |
| 2 | 'B' |
2 | 1 * 26 + 2 |
28 |
最终结果 28,正确。
代码
class Solution:
def titleToNumber(self, columnTitle: str) -> int:
res = 0
for ch in columnTitle:
value = ord(ch) - ord('A') + 1
res = res * 26 + value
return res复杂度分析
- 时间复杂度:$O(n)$,其中 $n$ 是字符串长度。
- 空间复杂度:$O(1)$,只使用常数个变量。
方法二:从右到左按位权
思路及解法
从右往左遍历,每一位的权重是 $26^k$,其中 $k$ 是从右数第几位(从 0 开始)。
res = 0
power = 1
for ch in reversed(columnTitle):
value = ord(ch) - ord('A') + 1
res += value * power
power *= 26举例:columnTitle = "AB"
- 从右往左:
'B'值 2,权重 1 →res += 2 * 1 = 2; 'A'值 1,权重 26 →res += 1 * 26 = 28;- 结果
28。
代码
class Solution:
def titleToNumber(self, columnTitle: str) -> int:
res = 0
power = 1
for ch in reversed(columnTitle):
value = ord(ch) - ord('A') + 1
res += value * power
power *= 26
return res复杂度分析
- 时间复杂度:$O(n)$。
- 空间复杂度:$O(1)$。
两种方法对比
| 方法 | 时间 | 空间 | 特点 |
|---|---|---|---|
| 从左到右迭代 | $O(n)$ | $O(1)$ | 代码最短,符合进制转换直觉 |
| 从右到左按位权 | $O(n)$ | $O(1)$ | 更贴近“展开式”理解 |
推荐:面试时直接写从左到右迭代,代码最简洁。
关键细节
1. 为什么是 ord(ch) - ord('A') + 1
ord('A') = 65,ord('B') = 66;ord(ch) - ord('A')得到0 ~ 25;- 加 1 后得到
1 ~ 26,对应A ~ Z。
2. 与普通 26 进制的区别
普通 26 进制中,A 表示 0,Z 表示 25,没有 1 ~ 26 的概念。Excel 列名称是「从 1 开始的 26 进制」,所以每一位都要加 1。
3. 不要写成 res = res * 26 + ord(ch) - ord('A')
这样会少加 1,A 会变成 0,结果错误。必须加 1。
4. 本题与 LC 168 的关系
- LC 171:列名称 → 列序号(本题,26 进制转十进制);
- LC 168:列序号 → 列名称(十进制转 26 进制,需要特殊处理
Z和借位)。
两题互为逆运算,可以一起练习。
总结
- 本质:26 进制转十进制,但每一位的数值范围是
1 ~ 26; - 核心公式:
res = res * 26 + (ord(ch) - ord('A') + 1)- 时间复杂度 $O(n)$,空间复杂度 $O(1)$;
- 易错点:忘记加 1,导致
A被当成 0; - 通用套路:「Excel 列名称」→ 从 1 开始的 26 进制。
相关题目
- LC 168. Excel 表列名称(列序号 → 列名称)
- LC 12. 整数转罗马数字(进制 / 符号转换)
- LC 13. 罗马数字转整数(符号转换)
171. Excel 表列序号
https://mingsm17518.github.io/2026/10/22/刷题笔记/Leetcode/179. 最大数/