🌧(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时,对于符号长度的最高位的增量为
那么现在我们固定字符长度,分析当最高位变化时的增量
--------------------------------------------
从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*(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❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄