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))class Solution {
public String convertToTitle(int columnNumber) {
StringBuilder res = new StringBuilder();
int n = columnNumber;
while (n > 0) {
n -= 1;
res.append((char) ('A' + n % 26));
n /= 26;
}
return res.reverse().toString();
}
}class Solution {
public:
string convertToTitle(int columnNumber) {
string res;
int n = columnNumber;
while (n > 0) {
n -= 1;
res += char('A' + n % 26);
n /= 26;
}
reverse(res.begin(), res.end());
return res;
}
};func convertToTitle(columnNumber int) string {
res := []byte{}
n := columnNumber
for n > 0 {
n -= 1
res = append(res, byte('A'+n%26))
n /= 26
}
for l, r := 0, len(res)-1; l < r; l, r = l+1, r-1 {
res[l], res[r] = res[r], res[l]
}
return string(res)
}var convertToTitle = function(columnNumber) {
const res = [];
let n = columnNumber;
while (n > 0) {
n -= 1;
res.push(String.fromCharCode(65 + n % 26));
n = Math.floor(n / 26);
}
return res.reverse().join('');
};function convertToTitle(columnNumber: number): string {
const res: string[] = [];
let n = columnNumber;
while (n > 0) {
n -= 1;
res.push(String.fromCharCode(65 + n % 26));
n = Math.floor(n / 26);
}
return res.reverse().join('');
}