Easy
题目描述
给你一个整数 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"
提示:
1 <= columnNumber <= 2^31 - 1
解题思路
解题思路
这道题本质上是将十进制数转换为26进制,但有一个特殊之处:Excel的列名没有0,而是从1开始的。
方法分析
核心观察:
- A-Z 对应 1-26
- AA 对应 27,相当于 26进制的 “11”,但从1开始计数
- 这是一个"没有0的26进制"系统
转换规律:
- 对于普通的k进制,余数范围是 [0, k-1]
- 对于Excel列名,我们需要的范围是 [1, 26]
- 当
columnNumber % 26 == 0时,应该对应 ‘Z’(26)
算法步骤:
- 不断除以26取余数
- 如果余数为0,说明这一位是’Z’,同时需要向前借位
- 将余数转换为对应的字母
- 重复直到columnNumber变为0
处理技巧:
- 在每次计算前,先将columnNumber减1,这样可以将问题转化为标准的26进制转换
- 或者在余数为0时特殊处理
推荐使用第一种方法(减1法),代码更简洁。
代码实现
class Solution {
public:
string convertToTitle(int columnNumber) {
string result = "";
while (columnNumber > 0) {
columnNumber--; // 转换为0-25的范围
result = char('A' + columnNumber % 26) + result;
columnNumber /= 26;
}
return result;
}
};
class Solution:
def convertToTitle(self, columnNumber: int) -> str:
result = ""
while columnNumber > 0:
columnNumber -= 1 # 转换为0-25的范围
result = chr(ord('A') + columnNumber % 26) + result
columnNumber //= 26
return result
public class Solution {
public string ConvertToTitle(int columnNumber) {
string result = "";
while (columnNumber > 0) {
columnNumber--; // 转换为0-25的范围
result = (char)('A' + columnNumber % 26) + result;
columnNumber /= 26;
}
return result;
}
}
var convertToTitle = function(columnNumber) {
let result = "";
while (columnNumber > 0) {
columnNumber--; // 转换为0-25的范围
result = String.fromCharCode('A'.charCodeAt(0) + columnNumber % 26) + result;
columnNumber = Math.floor(columnNumber / 26);
}
return result;
};
复杂度分析
| 复杂度类型 | 值 | 说明 |
|---|---|---|
| 时间复杂度 | O(log₂₆(n)) | 需要进行约log₂₆(columnNumber)次循环 |
| 空间复杂度 | O(log₂₆(n)) | 结果字符串的长度为log₂₆(columnNumber) |
相关题目
. Excel Sheet Column Number (Easy)
. Design Spreadsheet (Medium)