Easy
题目描述
给你一个字符串 columnTitle ,表示 Excel 表格中的列名称。返回该列名称对应的列序号。
例如:
A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28
...
示例 1:
输入: columnTitle = "A"
输出: 1
示例 2:
输入: columnTitle = "AB"
输出: 28
示例 3:
输入: columnTitle = "ZY"
输出: 701
提示:
1 <= columnTitle.length <= 7columnTitle仅由大写英文字母组成columnTitle在范围["A", "FXSHRXW"]内
解题思路
这道题本质上是进制转换问题,将26进制转换为十进制。
核心思路: Excel列名可以看作是一个特殊的26进制数,其中A=1, B=2, …, Z=26。与普通进制不同的是,这里没有0,最小值是1。
解法分析:
- 从右到左遍历:对于字符串"AB",从右到左处理,B对应个位,A对应26位
- 进制转换:每一位的值 = (字符-‘A’+1) × 26^位数
- 累加求和:将所有位的值相加得到最终结果
具体步骤:
- 初始化结果为0,进制基数为1
- 从字符串末尾开始遍历
- 对每个字符,计算其数值(字符-‘A’+1),乘以当前位的权重
- 累加到结果中,权重乘以26准备处理下一位
以"AB"为例:B = 2×1 = 2,A = 1×26 = 26,总和 = 28
时间复杂度: O(n),其中n是字符串长度 空间复杂度: O(1),只使用常数额外空间
代码实现
class Solution {
public:
int titleToNumber(string columnTitle) {
int result = 0;
int base = 1;
for (int i = columnTitle.length() - 1; i >= 0; i--) {
result += (columnTitle[i] - 'A' + 1) * base;
base *= 26;
}
return result;
}
};
class Solution:
def titleToNumber(self, columnTitle: str) -> int:
result = 0
base = 1
for i in range(len(columnTitle) - 1, -1, -1):
result += (ord(columnTitle[i]) - ord('A') + 1) * base
base *= 26
return result
public class Solution {
public int TitleToNumber(string columnTitle) {
int result = 0;
int baseValue = 1;
for (int i = columnTitle.Length - 1; i >= 0; i--) {
result += (columnTitle[i] - 'A' + 1) * baseValue;
baseValue *= 26;
}
return result;
}
}
var titleToNumber = function(columnTitle) {
let result = 0;
let base = 1;
for (let i = columnTitle.length - 1; i >= 0; i--) {
result += (columnTitle.charCodeAt(i) - 'A'.charCodeAt(0) + 1) * base;
base *= 26;
}
return result;
};
复杂度分析
| 复杂度类型 | 值 | 说明 |
|---|---|---|
| 时间复杂度 | O(n) | n为字符串长度,需要遍历每个字符一次 |
| 空间复杂度 | O(1) | 只使用常数个额外变量 |