LeetCode 第171题:Excel表列序号
题目描述
给你一个字符串 columnTitle
,表示 Excel 表格中的列名称。返回 该列名称对应的列序号。
例如:
A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28
...
难度
简单
题目链接
点击在LeetCode中查看题目
示例
示例 1:
输入: columnTitle = "A"
输出: 1
示例 2:
输入: columnTitle = "AB"
输出: 28
示例 3:
输入: columnTitle = "ZY"
输出: 701
示例 4:
输入: columnTitle = "FXSHRXW"
输出: 2147483647
提示
1 <= columnTitle.length <= 7
columnTitle
仅由大写英文组成columnTitle
在范围["A", "FXSHRXW"]
内
解题思路
方法:26进制转换
本题是第168题的逆问题,是将26进制数转换为10进制数。需要注意的是,Excel列名是从1开始的,而不是0(A对应1,而不是0)。
关键点:
- 将问题视为26进制转10进制的转换
- 遍历字符串,对每个字符计算其对应的数值并累加到结果中
- 注意Excel列名是从1开始的,计算时需要将字符映射为1-26,而不是0-25
时间复杂度:O(n),其中n是字符串的长度。
空间复杂度:O(1),只需要常数额外空间。
代码实现
C# 实现
public class Solution {public int TitleToNumber(string columnTitle) {int result = 0;foreach (char c in columnTitle) {// 将字符转换为对应的数值(A=1, B=2, ..., Z=26)int value = c - 'A' + 1;// 累加到结果中,相当于进位操作result = result * 26 + value;}return result;}
}
Python 实现
class Solution:def titleToNumber(self, columnTitle: str) -> int:result = 0for c in columnTitle:# 将字符转换为对应的数值(A=1, B=2, ..., Z=26)value = ord(c) - ord('A') + 1# 累加到结果中,相当于进位操作result = result * 26 + valuereturn result
C++ 实现
class Solution {
public:int titleToNumber(string columnTitle) {int result = 0;for (char c : columnTitle) {// 将字符转换为对应的数值(A=1, B=2, ..., Z=26)int value = c - 'A' + 1;// 累加到结果中,相当于进位操作result = result * 26 + value;}return result;}
};
性能分析
各语言实现的性能对比:
实现语言 | 执行用时 | 内存消耗 | 特点 |
---|---|---|---|
C# | 80 ms | 36.3 MB | 实现简洁,性能适中 |
Python | 32 ms | 16.2 MB | 代码最简洁 |
C++ | 0 ms | 6.0 MB | 性能最优 |
补充说明
代码亮点
- 使用进制转换思想解决问题
- 巧妙处理1-based的问题,将字符映射到1-26
- 代码简洁,易于理解
常见错误
- 将字符映射到0-25而不是1-26,导致计算错误
- 没有正确处理进位操作,导致计算错误
- 没有考虑大数情况,可能导致溢出
相关题目
- 168. Excel表列名称
- 12. 整数转罗马数字
- 13. 罗马数字转整数