LeetCode - 168. Excel表列名称

文章介绍了如何用Python实现Excel列名称与十进制数之间的转换,主要涉及二进制和十进制的转换方法。提供了两种不同的思路,一是通过模拟二进制转十进制的过程,二是利用对26的取余和除法操作来得到对应的字母。
摘要由CSDN通过智能技术生成

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])   # 反转,第一个算出来的字母应放在字符串最后面

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cheer-ego

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值