Article / 文章

LeetCode 第168题:Excel表列名称

给你一个整数 columnNumber,返回它在 Excel 表中相对应的列名称。 例如: A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ...

题目描述

给你一个整数 columnNumber,返回它在 Excel 表中相对应的列名称。

例如:

A -> 1
B -> 2
C -> 3
...
Z -> 26
AA -> 27
AB -> 28 
...

难度

简单

题目链接

点击在LeetCode中查看题目

示例

示例 1:

输入:columnNumber = 1
输出:"A"

示例 2:

输入:columnNumber = 28
输出:"AB"

示例 3:

输入:columnNumber = 701
输出:"ZY"

示例 4:

输入:columnNumber = 2147483647
输出:"FXSHRXW"

提示

  • 1 <= columnNumber <= 2^31 - 1

解题思路

方法:26进制转换

本题实质上是将10进制数转换为26进制,但有一点不同:通常的进制转换是从0开始的,而Excel列名是从1开始的(A对应1,而不是0)。 关键点:

  1. 将问题转化为26进制转换问题
  2. 注意Excel列名是从1开始的,需要对输入进行调整
  3. 使用’A’+余数 来获取对应的字母

时间复杂度:O(log(n)),其中n是列号。 空间复杂度:O(log(n)),用于存储结果字符串。

代码实现

C# 实现

public class Solution {
    public string ConvertToTitle(int columnNumber) {
        StringBuilder result = new StringBuilder();
        
        while (columnNumber > 0) {
            // 由于Excel列名是从1开始的,需要-1
            columnNumber--;
            
            // 获取当前位的字母
            char c = (char)('A' + columnNumber % 26);
            result.Insert(0, c);
            
            // 除以26,处理下一位
            columnNumber /= 26;
        }
        
        return result.ToString();
    }
}

Python 实现

class Solution:
    def convertToTitle(self, columnNumber: int) -> str:
        result = []
        
        while columnNumber > 0:
            # 由于Excel列名是从1开始的,需要-1
            columnNumber -= 1
            
            # 获取当前位的字母
            result.append(chr(ord('A') + columnNumber % 26))
            
            # 除以26,处理下一位
            columnNumber //= 26
        
        # 反转结果列表并拼接为字符串
        return ''.join(reversed(result))

C++ 实现

class Solution {
public:
    string convertToTitle(int columnNumber) {
        string result;
        
        while (columnNumber > 0) {
            // 由于Excel列名是从1开始的,需要-1
            columnNumber--;
            
            // 获取当前位的字母
            char c = 'A' + columnNumber % 26;
            result = c + result;
            
            // 除以26,处理下一位
            columnNumber /= 26;
        }
        
        return result;
    }
};

性能分析

各语言实现的性能对比:

实现语言 执行用时 内存消耗 特点
C# 76 ms 36.2 MB 实现简洁,性能适中
Python 40 ms 16.2 MB 代码易读
C++ 0 ms 5.9 MB 性能最优

补充说明

代码亮点

  1. 使用进制转换思想解决问题
  2. 巧妙处理1-based的问题,通过先减1再计算的方式
  3. 各语言实现都采用了从低位到高位的计算方式

常见错误

  1. 没有处理Excel列名是从1开始的问题,导致计算错误
  2. 字符拼接顺序错误,没有从高位到低位拼接
  3. 没有考虑大数情况,可能导致溢出

相关题目