在问 · 算法题解

168. Excel 表列名称

题目描述

输入正整数 columnNumber,返回 Excel 表格中第 columnNumber 列的列名。

列名用大写字母编号:第 1 到 26 列依次是 A 到 Z;第 27 列是 AA,第 28 列是 AB,依此类推,AZ 之后是 BA。

示例 1
输入:columnNumber = 1
输出:"A"

解释:第 1 列是 A。

示例 2
输入:columnNumber = 28
输出:"AB"

解释:26 列之后从 AA 开始,第 28 列是 AB。

示例 3
输入:columnNumber = 701
输出:"ZY"

解释:701 = 26 × 26 + 25,对应 ZY。

数据范围

  • 1 <= columnNumber <= 2^31 - 1

解题思路

这是一种“没有 0”的 26 进制:每一位的取值是 1–26 而不是 0–25。每轮先把 n 减 1,把最低位映射到 0–25,然后 n % 26 就是最低位字母(A 对应 0),再 n //= 26 去掉这一位。字母从低位到高位产生,最后反转。

为什么正确

每轮开始时,n 是还没转换的高位部分所代表的列号,res 里是已经确定的低位字母(倒序)。

复杂度分析

时间 O(log₂₆ n);空间 O(log₂₆ n)。

易错点

不能直接用 n % 26:26 应该是 Z,但 26 % 26 = 0。必须先减 1 再取余和整除,否则 26、52、702 这类数会出错。

参考代码

Python、Java、C++、Go、JavaScript、TypeScript 六种语言,逻辑一致。

class Solution:
    def convertToTitle(self, columnNumber: int) -> str:
        res = []
        n = columnNumber
        while n > 0:
            n -= 1
            res.append(chr(ord('A') + n % 26))
            n //= 26
        return ''.join(reversed(res))

载入编辑器,自己跑一遍 →

字符串 专题的其他题目

查看 字符串 全部题目 →