Article / 文章

LeetCode 第171题:Excel表列序号

给你一个字符串 columnTitle,表示 Excel 表格中的列名称。返回 该列名称对应的列序号。 例如: A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ...

题目描述

给你一个字符串 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)。 关键点:

  1. 将问题视为26进制转10进制的转换
  2. 遍历字符串,对每个字符计算其对应的数值并累加到结果中
  3. 注意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 = 0
        
        for c in columnTitle:
            # 将字符转换为对应的数值(A=1, B=2, ..., Z=26)
            value = ord(c) - ord('A') + 1
            
            # 累加到结果中,相当于进位操作
            result = result * 26 + value
        
        return 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. 使用进制转换思想解决问题
  2. 巧妙处理1-based的问题,将字符映射到1-26
  3. 代码简洁,易于理解

常见错误

  1. 将字符映射到0-25而不是1-26,导致计算错误
  2. 没有正确处理进位操作,导致计算错误
  3. 没有考虑大数情况,可能导致溢出

相关题目