🌧(day52:P49)

目录

📝题目:

🚩题目分析:

💡解题思路:

🌈代码实现

✏代码注释


📝题目:

给你一个字符串 columnTitle ,表示 Excel 表格中的列名称。返回 该列名称对应的列序号

  • 1 <= columnTitle.length <= 7
  • columnTitle 仅由大写英文组成
  • columnTitle 在范围 ["A", "FXSHRXW"] 内

例如:

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

⭐示例 1:

输入: columnTitle = "A"

输出: 1

⭐示例 2:

输入: columnTitle = "AB"

输出: 28

⭐示例 3:

输入: columnTitle = "ZY"

输出: 701

🚩题目分析:

一位长度的列序号A~Z == > 1 ~ 26,两位长度的列序号 AA ~ ZZ ==> 27 ~ 702,三位长度的列序号AAA ~ ZZZ ==> 703 ~ 18278,AAAA ~ ZZZZ ==> 18279 ~ 475254.......

💡解题思路:

对于A ~ Z 我们很容易知道是 1 ~ 26,

那么对 AA ~ ZZ ==> 27 ~ 702,AAA ~ ZZZ ==> 703 ~ 18278,......


我们怎么算出这些列序号?

可以看到随着序号字符的增长,列序号一某种方式增大。

我们分析关于和列序号字符长度有关的最高位的增量。

---------------------------------------------

A ~ Z ==> 1 ~ 26,  字符长度1

AA ~ ZZ ==> 27 ~ 702      字符长度2

AAA ~ ZZZ ==> 703 ~ 18278     字符长度3

AAAA ~ ZZZZ ==> 18279 ~ 475254 字符长度4

----------------

从A ---> AA 

增量 = AA - A = 27 - 1 = 26

------------------

从AA ---> AAA

增量 = AAA - AA = 703 - 27 = 676 = 26*26

-------------------

从AAA ---> AAAA

增量 = AAAA - A AA = 18279 - 703 = 17576  = 26*26*26

------------------------------------------------------------

那么结果显然易见,当列序号字符长度为n时,对于符号长度的最高位的增量为

py schema column类型 python里column_leetcode


那么现在我们固定字符长度,分析当最高位变化时的增量

--------------------------------------------

从AA ---> BA

增量 = BA - AA = 53 - 27 = 26 

从AA ---> CA

增量 = CA - AA = 79 - 27 = 52 = 2*26

------------------------------------------------

从AAA ---> BAA

增量 = BAA - AAA = 1379 - 703 = 676 = 26*26

从AAA ---> CAA

增量 = CAA - AAA = 2055 - 703 = 676 = 2*26*26

------------------------------------------------

那我们得出当高位变化时的增量为k*

py schema column类型 python里column_leetcode

(k为最高位字符对应的数值,如A对应1,B对应2)


当然,实际情况下可能我们没有那么多时间一个一个举例来找出规律。那么我们可以按照中选时学的排列组合来思考。


当列名称的长度为 n 时,列名称的每个字母都有 26 种不同的取值,因此长度为 n的不同列名称有 26^n个。


当最高位是 A 时,除了最高位的n−1 位有 26^(n-1)种不同的取值,因为每两个连续的列序号相差为1,所以最高位A 对列序号的增量为 26^(n-1)。

当最高位是 B 时,和最高位是A 相比,最高位从 A 变成B,其余 n-1 位不变,列序号增加了 26^(n-1)。因此最高位 B 对列序号的增量为 2*26^(n-1)
n−1。

当最高位是第 k 个字母时,最高位对列序号的增量为 k *26^(n-1)(k为最高位字符对应的数值,如A对应1,B对应2)

那么“ATBK”的计算为

ATBK==> [1,20,2,11]

1*26^3 + 20*26^2 + 2*26^1 + 11*26^0 = 31159

🌈代码实现

def titleToNumber(columnTitle):
    res, square = 0, 1
    for i in range(len(columnTitle) - 1, -1, -1):
        k = ord(columnTitle[i]) - ord("A") + 1
        res += k * square
        square *= 26
    return res

✏代码注释

def titleToNumber(columnTitle):
    res, square = 0, 1  # res为最终结果,square用于积累平方量
    
    # rang(n,-1,-1)的形式表示从右到左遍历
    for i in range(len(columnTitle) - 1, -1, -1):
        # 使用ord()函数获取ASCLL值
        k = ord(columnTitle[i]) - ord("A") + 1
        res += k * square
        square *= 26
    return res

这里说明一下rang(len(columnTitle) - 1, -1, -1):

len(columnTitle)表示遍历起始位置

第一个-1表示遍历终止位置

第二个-1表示移到步长,负数表示从尾到头遍历

ord()函数用于获取字符的ASCLL值包括A~Z,因为我们需要说明A~Z对应的值(1~26),

那么使用ord()函数,我们就可以直接计算出字符(A~Z)对应的值(1~26),而不需要再创建一个字典来声明A~Z对应的值,如

dct = {
    'A': 1, 'B': 2, 'C': 3, 'D': 4,
    'E': 5, 'F': 6, 'G': 7, 'H': 8,
    'I': 9, 'J': 10, 'K': 11, 'L': 12,
    'M': 13, 'N': 14, 'O': 15, 'P': 16,
    'Q': 17, 'R': 18, 'S': 19, 'T': 20,
    'U': 21, 'V': 22, 'W': 23, 'X': 24,
    'Y': 25, 'Z': 26
}


程序时间复杂度为O(n), n 是列名称columnTitle 的长度,空间复杂度O(1)

今天就到这,明天见。🚀

❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄end❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄