168. Excel表列名称

155 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第32天,点击查看活动详情

一、题目描述:

168. Excel表列名称 - 力扣(LeetCode) (leetcode-cn.com)

给你一个整数 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 <= 2^31 - 1

二、思路分析:

就是最基本的思路,先把26个英文字母放字典里,然后再计算输出字符的长度k和剩余值x,最后再根据剩余值计算出字符。

先说明一下,这题根据我的判断,应该不是26进制,因为似乎少个0

‘Z’转变为‘AA’,而‘A’代表1,如果是26进制,理论上应该‘AA’表示二进制里的10这种形式

然后仔细讲讲这里的剩余值x,可以看到一条较明显的数字规律,那就是Z=26, ZZ=26 + 26^2.....如此循环下去

那么我们可以用作差并循环,在这一过程中计算出剩余值对26^(k-1)的倍数

这个倍数对应着字典中的键,最后z将所有键拼接成结果

以上是具体思路,细节部分看看代码应该能明白,不过我感觉我这方法很low。

三、AC 代码:

class Solution:
    def convertToTitle(self, n: int) -> str:
        column = {1:'A', 2:'B', 3:'C', 4:'D', 5:'E', 6:'F', 7:'G', 8:'H', 9:'I', 10:'J',
        11:'K', 12:'L', 13:'M', 14:'N', 15:'O', 16:'P', 17:'Q', 18:'R', 19:'S', 20:'T',
        21:'U', 22:'V', 23:'W', 24:'X', 25:'Y', 26:'Z'}
        if n <= 26:
            return column[n]
        k = 0
        while n > 0:
            x = n
            n = n - 26**(k+1)
            k += 1
        c = ''
        while k > 1:
            m = x / 26**(k-1)
            if m - x // 26**(k-1) > 0:
                a = x // 26**(k-1) + 1
            else:
                a = x // 26**(k-1)
            c += column[a]
            print(a)
            x -= (a-1) * 26**(k-1)
            k -= 1
            if x == 0:
                break
        if x == 0:
            return c + 'Z' * k
        else:
            return c + column[x]

范文参考

C语言:简简单单的几行代码解决问题 - Excel表列名称 - 力扣(LeetCode)