171. Excel 表列序号

171. Excel 表列序号

题目链接(简单)

题目描述

给你一个字符串 columnTitle,表示 Excel 表格中的列名称。返回该列名称对应的列序号。

例如:

A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28
...

数据范围:

  • 1 <= columnTitle.length <= 7
  • columnTitle 仅由大写英文字母组成
  • 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)

方法一:从左到右迭代(推荐)

思路及解法

从左到右扫描每个字符:

  1. 当前字符对应的数值为 ord(ch) - ord('A') + 1;
  2. 把之前累计的结果乘 26,再加上当前字符的数值;
  3. 遍历结束后,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. 最大数/
作者
Ming
发布于
2026年10月22日
更新于
2026年10月22日
许可协议