力扣刷题(十一)--Excel表列序号--python语言描述--titleToNumber

题目描述:
给定一个Excel表格中的列名称,返回其相应的列序号。

例如,
A -> 1
B -> 2
C -> 3

Z -> 26
AA -> 27
AB -> 28

示例 1:
输入: “A”
输出: 1

示例 2:
输入: “AB”
输出: 28

示例 3:
输入: “ZY”
输出: 701

拿到这道题的第一反应是字典,然后一一对应,26个字母一个轮回。但是只能适用于一个字符串或者两个字符串。因此不具有普适性。

下面是力扣热心网友给出的题解。

解题方案

思路

  • 标签:字符串遍历,进制转换
  • 初始化结果ans = 0,遍历时将每个字母与A做减法,因为A表示1,所以减法后需要每个数加1,计算其代表的数值num = 字母 - ‘A’ + 1
  • 因为有26个字母,所以相当于26进制,每26个数则向前进一位
  • 所以每遍历一位则ans = ans * 26 + num
  • 以ZY为例,Z的值为26,Y的值为25,则结果为26 * 26 + 25=701
  • 时间复杂度:O(n)

代码

class Solution(object):
    def titleToNumber(self, s):
        
        ans = 0;
        
        for i in range (len(s)):
            
            num = ord(s[i]) - ord('A') + 1;
            ans = ans * 26 + num;

        return ans;

总结:

  1. 抽象出来进制转换问题(26进制转换成10进制)
  2. 26进制转10进制思考的时候从最低位开始乘26的n次幂,依次求和相加。编程的时候则可以如上面所示,从高位开始依次从左往右走。因为ans是从0开始乘,所以左侧实际也就是幂次最高取到2(假设字符串长度为3)
  3. 具体的进制转换总结可以参考:
    https://blog.csdn.net/meegomeego/article/details/49948241

你可能感兴趣的:(算法刷题,编程)