168. Excel表列名称
给你一个整数 columnNumber
,返回它在 Excel 表中相对应的列名称。例如:
A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ...
二进制与十进制之间的转换
在做这题之前,先复习一下二进制与十进制之间是怎么转换的
(一)二进制转十进制
如二进制下的100,转为十进制,为:0*2^0 + 0*2^1 + 1*2^2 = 4
二进制下的101,转为十进制,为:1*2^0 + 0*2^1 + 1*2^2 = 5
思路就是:
- 2的幂次方的数字,怎么获取:这个数字是每次+1的
- 2的幂次方乘的那个数字,怎么获取:这个数字其实就是原始二进制数的最后一位,可以用x%2表示;同时要注意 x 通过每次 //10,将最后一位的那个数从右往左依次移动
class Solution:
def convertToTitle(self, columnNumber: int) -> str:
x = 10101
y = 0
t = 0
'''
x = 10101 t=0
1*2^0
x = 1010 t=1
0*2^1
x = 101 t=2
1*2^2
x = 10 t=3
0*2^3
x = 1 t=4
1*2^4
x = 0
'''
while x:
y += (2**t)*(x%2)
x //= 10
t += 1
print(y)
(二)十进制转二进制
怎么转的,以十进制100转换为二进制为例,看下面这个图就明白了:
代码实现如下:
class Solution:
def convertToTitle(self, columnNumber: int) -> str:
x = 100
y = ''
while x:
t = x%2
# ord() char -> num
# chr() num -> char
y = chr(ord('0')+t) + y
x //= 2
print(y)
168题Python代码
(一)思路一
最后再来分析一下本题:它给出的数是【每一位都是从1开始的二十六进制数】
思路:在转换过程中将每一位都减1,这样就得到了正常的、从0开始的二十六进制数,然后再把它表示成字母表示的二十六进制数即可
(代码跟上面的十进制转二进制几乎差不多,理解了这个,本题就好懂了)
class Solution:
def convertToTitle(self, x: int) -> str:
y = ''
while x:
x -= 1
t = x%26
# ord() char -> num
# chr() num -> char
y = chr(ord('A')+t) + y
x //= 26
return y
(二)思路二
参考这个视频: 168-Excel表列名称-Python3_哔哩哔哩_bilibili
class Solution:
def convertToTitle(self, x: int) -> str:
res = []
while x:
res.append( chr(ord("A")+(x-1)%26) )
x = (x-1)//26
return "".join(res[::-1]) # 反转,第一个算出来的字母应放在字符串最后面