Article / 文章
LeetCode 第168题:Excel表列名称
给你一个整数 columnNumber,返回它在 Excel 表中相对应的列名称。 例如: A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ...
题目描述
给你一个整数 columnNumber,返回它在 Excel 表中相对应的列名称。
例如:
A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28
...
难度
简单
题目链接
示例
示例 1:
输入:columnNumber = 1
输出:"A"
示例 2:
输入:columnNumber = 28
输出:"AB"
示例 3:
输入:columnNumber = 701
输出:"ZY"
示例 4:
输入:columnNumber = 2147483647
输出:"FXSHRXW"
提示
1 <= columnNumber <= 2^31 - 1
解题思路
方法:26进制转换
本题实质上是将10进制数转换为26进制,但有一点不同:通常的进制转换是从0开始的,而Excel列名是从1开始的(A对应1,而不是0)。 关键点:
- 将问题转化为26进制转换问题
- 注意Excel列名是从1开始的,需要对输入进行调整
- 使用’A’+余数 来获取对应的字母
时间复杂度:O(log(n)),其中n是列号。 空间复杂度:O(log(n)),用于存储结果字符串。
代码实现
C# 实现
public class Solution {
public string ConvertToTitle(int columnNumber) {
StringBuilder result = new StringBuilder();
while (columnNumber > 0) {
// 由于Excel列名是从1开始的,需要-1
columnNumber--;
// 获取当前位的字母
char c = (char)('A' + columnNumber % 26);
result.Insert(0, c);
// 除以26,处理下一位
columnNumber /= 26;
}
return result.ToString();
}
}
Python 实现
class Solution:
def convertToTitle(self, columnNumber: int) -> str:
result = []
while columnNumber > 0:
# 由于Excel列名是从1开始的,需要-1
columnNumber -= 1
# 获取当前位的字母
result.append(chr(ord('A') + columnNumber % 26))
# 除以26,处理下一位
columnNumber //= 26
# 反转结果列表并拼接为字符串
return ''.join(reversed(result))
C++ 实现
class Solution {
public:
string convertToTitle(int columnNumber) {
string result;
while (columnNumber > 0) {
// 由于Excel列名是从1开始的,需要-1
columnNumber--;
// 获取当前位的字母
char c = 'A' + columnNumber % 26;
result = c + result;
// 除以26,处理下一位
columnNumber /= 26;
}
return result;
}
};
性能分析
各语言实现的性能对比:
| 实现语言 | 执行用时 | 内存消耗 | 特点 |
|---|---|---|---|
| C# | 76 ms | 36.2 MB | 实现简洁,性能适中 |
| Python | 40 ms | 16.2 MB | 代码易读 |
| C++ | 0 ms | 5.9 MB | 性能最优 |
补充说明
代码亮点
- 使用进制转换思想解决问题
- 巧妙处理1-based的问题,通过先减1再计算的方式
- 各语言实现都采用了从低位到高位的计算方式
常见错误
- 没有处理Excel列名是从1开始的问题,导致计算错误
- 字符拼接顺序错误,没有从高位到低位拼接
- 没有考虑大数情况,可能导致溢出