Excel表列名称

标签: 数学 字符串

难度: Easy

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

例如:

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

 

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

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

 

提示:

  • 1 <= columnNumber <= 231 - 1

Submission

运行时间: 13 ms

内存: 16.0 MB

class Solution:
    def convertToTitle(self, columnNumber: int) -> str:
        result = ""
        while columnNumber > 26 :
            temp = columnNumber % 26
            if temp == 0:
                result = 'Z' + result
                columnNumber = columnNumber //26 -1
            else:
                result = chr(temp + 64) +result
                columnNumber = columnNumber //26           
        result = chr(columnNumber + 64) + result
        return result

Explain

这个题解使用了类似进制转换的思想。首先将给定的列号不断对26取模,得到各位的数字(实际对应字母的ASCII码),然后将列号整除26。重复该过程直到列号小于等于26。最后将得到的各位数字根据ASCII码转换为对应的字母,即可得到Excel表列名称。需要注意的是,由于Excel表列名称中不存在数字0,因此在每次取模后需要特殊处理余数为0的情况。

时间复杂度: O(log n)

空间复杂度: O(log n)

class Solution:
    def convertToTitle(self, columnNumber: int) -> str:
        result = ""
        while columnNumber > 26:
            # 对26取模,得到当前位的数字
            temp = columnNumber % 26
            if temp == 0:
                # 如果余数为0,将当前位设为'Z',并将columnNumber减1
                result = 'Z' + result
                columnNumber = columnNumber // 26 - 1
            else:
                # 将数字转换为对应的字母,拼接到result的前面
                result = chr(temp + 64) + result
                columnNumber = columnNumber // 26
        # 处理最高位的数字
        result = chr(columnNumber + 64) + result
        return result

Explore

在Excel列编码中,是一个从1开始的26进制系统,没有0这个数字。通常,当一个数在传统的26进制中被26整除时,余数是0。但在Excel列名中,当出现余数为0时,实际上应该表示为'Z',而不是像传统26进制那样可以直接置为0并进位。因此,我们必须将columnNumber减1,以正确地处理这种情况。这样可以把'Z'当作26处理(即A=1, B=2, ..., Z=26),然后减1之后再整除26,确保下一轮计算时位数能正确下降。

是的,这种方法能够确保所有大于26的数都能正确转换成Excel列名。这个算法实际上是模仿了26进制的转换,但特别处理了余数为0的情况。通过不断对26取模来确定每个位置上的字母,然后通过整除26减少columnNumber的大小,可以保证最终将任何大于26的数转换成正确的Excel列名。

当columnNumber正好等于26时,按照算法首先会对26取模,结果为0,并且columnNumber将变为0(26/26-1=0)。这意味着最终的结果应该是'Z'。对于最后单独处理最高位数字的原因是,循环结束时,可能会剩下一个不足以再次整除26的数字,这个数字需要直接转换成对应的字母,并且加到结果的最前面。这步骤是必要的,因为最高位在循环中未被处理,循环只处理除最高位以外的其他位。

在ASCII编码中,大写字母'A'的ASCII码是65。因此,当我们使用`chr(temp + 64)`的方式时,实际上是将1-26的数字转换成'A'到'Z'。例如,如果temp是1,则`chr(1+64)`就是`chr(65)`,即'A';如果temp是26,则`chr(26+64)`就是`chr(90)`,即'Z'。这种转换是基于ASCII值的计算,保证了数字能正确转换为对应的大写字母。