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 <= 7
  • columnTitle 仅由大写英文字母组成
  • columnTitle 在范围 ["A", "FXSHRXW"]

解题思路

这道题本质上是进制转换问题,将26进制转换为十进制。

核心思路: Excel列名可以看作是一个特殊的26进制数,其中A=1, B=2, …, Z=26。与普通进制不同的是,这里没有0,最小值是1。

解法分析:

  1. 从右到左遍历:对于字符串"AB",从右到左处理,B对应个位,A对应26位
  2. 进制转换:每一位的值 = (字符-‘A’+1) × 26^位数
  3. 累加求和:将所有位的值相加得到最终结果

具体步骤:

  • 初始化结果为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)只使用常数个额外变量

相关题目