LeetCode题目解析

Easy

168. Excel表列名称

题目描述

给定一个正整数 columnNumber,返回它在 Excel 表中对应的列名称。

示例:

1
2
3
4
5
6
7
8
输入:columnNumber = 1
输出:"A"

输入:columnNumber = 28
输出:"AB"

输入:columnNumber = 701
输出:"ZY"

解题思路

这题本质上是一个特殊的 26 进制转换。

普通的进制转换通常从 0 开始计数,而 Excel 列名是从 1 开始计数:

1
2
3
4
5
6
A -> 1
B -> 2
...
Z -> 26
AA -> 27
AB -> 28

因此在每一轮取余之前,需要先执行 columnNumber--,把 1 ~ 26 映射成 0 ~ 25

然后通过:

1
char ch = (char) ('A' + remainder);

就可以得到当前位对应的字母。

由于每次得到的是最低位字符,所以需要把字符插入到结果字符串的最前面。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package easy;

public class _168ExcelSheetColumnTitle {
public String convertToTitle(int columnNumber) {
StringBuilder result = new StringBuilder();
int remainder;
while (columnNumber != 0) {
columnNumber--;
remainder = columnNumber % 26;
char ch = (char) ('A' + remainder);
columnNumber /= 26;
result.insert(0, ch);
}
return result.toString();
}
}

复杂度分析

  • 时间复杂度:O(log26 n),每次循环都会将 columnNumber 除以 26。
  • 空间复杂度:O(log26 n),结果字符串的长度与转换后的列名长度有关。

易错点

  • 不能直接对 columnNumber 取余,否则 26 会得到 0,无法正确映射到 Z
  • 每轮循环都要先执行 columnNumber--,再进行取余和除法操作。

Medium

hard