题目描述
给定一个正整数,返回它在 Excel
表中相对应的列名称。
例如,
1 -> A
2 -> B
3 -> C
…
26 -> Z
27 -> AA
28 -> AB
…
示例 1:
输入: 1
输出: “A”
示例 2:
输入: 28
输出: “AB”
示例 3:
输入: 701
输出: “ZY”
思考
根据规律,不难看出这里是一个26进制的问题。
对比十进制,0,1,2,3,4,5,6,7,8,9
不同之处就在于十进制是:
0
, 1
, 2
, 3
, 4
, 5
, 6
, 7
, 8
, 9
, 10
最后一位是10
,而是不我们题目这里的逻辑00
,这里就是题目的26进制和十进制的略微的差别。
因为,题目所给的是A
,B
,C
,……,Z
,AA
,AB
,……
代码实现
不妨先来几个案例看看:
#找规律:
27 = 26 * 1 + 1 => [1][1] => AA
28 = 26 * 1 + 2 => [1][2] => AB
701 = 26 * 26 + 25 => [26][25] => ZY
702 = 26 * 26 + 26 => [26][26] => ZZ
特别是702
,我们不难计算:702 = 26 * 27
27 > 26
但是如果再次计算就变成了 702 = 26*(26 * 1 + 1) + 0
按照我们的逻辑,其位数就变成了三位数,分别是[1][1][0]
,但是实际是两位数,故而需要单独处理一下。
使之成为702 = 26 * 26 + 26 => [26][26] => ZZ
以得到正确的结果
class Solution(object):
def convertToTitle(self, n):
"""
:type n: int
:rtype: str
"""
wordlist = ['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
# 找规律:
# 27 = 26 * 1 + 1 => [1][1] => AA
# 28 = 26 * 1 + 2 => [1][2] => AB
# 701 = 26 * 26 + 25 => [26][25] => ZY
# 702 = 26 * 26 + 26 => [26][26] => ZZ
sum = ''
while n:
a = n % 26
# 特殊情况,如 702 // 26 = 27 余 0
if a == 0:
sum = 'Z' + sum
n = (n - 26) // 26
else:
sum = wordlist[a - 1] + sum
n = n // 26
return sum
if __name__ == '__main__':
print(Solution().convertToTitle(28))
结果:
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/excel-sheet-column-title