持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情
一、题目描述:
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进制,但是我们一般都是从0开始,而题目中的替换并没有0,即最小都是1,A,到了26没有进位,而是直接用Z表示,因此,需要进行一个往左的平移,将他看作是从0开始到25,到26的时候进位,这个时候就跟我们常用的进制一样。
向左平移后,比如,num=26,num-1 % 26后,得到25,此时我们对余数25赋予Z,即实际上对应的值应该是向左平移前的26,而当num=27时,平移得26,26 % 26 =0,这个时候我们对余数0赋予A,并进位1,得到AA。
三、AC 代码:
class Solution:
def convertToTitle(self, columnNumber: int) -> str:
strs=[]
while columnNumber > 0:
columnNumber -= 1
cur = columnNumber % 26
s=chr (cur + ord('A'))
strs.append(s)
columnNumber = columnNumber // 26
return ("".join(strs)[::-1])
总结
- 直接遍历26个字母,省略进制转换的麻烦
- 转换逻辑:可根据实际计算可知:从右往左除26取余,地板除循环
- 边界处理,26地板除为1,可再次进入循环,但是该26位已进行转换,则可以将其-1巧妙的化解循环
- 地板除+取余的功能:可进行进制转换,满(地板除)则进一,缺(取余)则取值
范文参考: