Skip to content

Latest commit

 

History

History
74 lines (54 loc) · 2.61 KB

File metadata and controls

74 lines (54 loc) · 2.61 KB

https://leetcode-cn.com/problems/excel-sheet-column-number/solution/171excelbiao-lie-xu-hao-xiang-xi-jie-xi-4bygt/

难度:简单

题目

给定一个Excel表格中的列名称,返回其相应的列序号。 例如,

    A -> 1
    B -> 2
    C -> 3
    ...
    Z -> 26
    AA -> 27
    AB -> 28 
    ...

示例

示例 1:
输入: "A"
输出: 1

示例 2:
输入: "AB"
输出: 28

示例 3:
输入: "ZY"
输出: 701

分析

关于excel列表序号,先来看这道简单的开胃菜题目,之后还有逆向的对比题目:

由于excel列表是A-Z的26位数字, 当数字为27时就变成了AA,那么很明确是26进制。 将这道题转化为26进制转10进制的思路后,就很简单了。由于columnTitle是字符串类型, 我们就举个关于十进制字符串求总和的例子,来套用这道题。

如何将'123'转化为十进制数?大佬们要说了int(123),如果是要说这种解题思路, 那来来来键盘给你,你来写(这里举例子10进制只是为了方便大家理解)。

  1. 首先我们需要定义初始num = 0
  2. 然后for循环每一个字符串
  3. 现将上一次计算的num * 进制数(这里为10),然后在加上当前的数字
  4. 重复3动作最终求总和后返回结果即可。

有了上面的思路,那这道题照搬模板打套路就好了。这里唯一要注意的一点是,excel中 A-Z代表1--26,是没有0的,所以当我们获取到每一位的字符串时通过 ord('string') - ord('A') + 1的公式获取结果,当然为了运行加速, 简便的方式就是 ord('A') - 1 = 65 - 1 = 64,改写为 ord('string') - 64。 算法本身就是扣细节的事情,能省则省。来看看解题:

解题

class Solution:
    def titleToNumber(self, columnTitle):
        ret = 0
        for i in columnTitle:
            ret = ret * 26 + ord(i) - 64
        return ret

欢迎关注我的公众号: 清风Python,带你每日学习Python算法刷题的同时,了解更多python小知识。

有喜欢力扣刷题的小伙伴可以加我微信(King_Uranus)互相鼓励,共同进步,一起玩转超级码力!

我的个人博客:https://qingfengpython.cn

力扣解题合集:https://github.com/BreezePython/AlgorithmMarkdown