题目描述
给了一个正整数k,表示长度是k的所有回文数字
再给了和很多q,问第q小的数字是多少?
f1 数学关系+构造 |
基本分析
- 从q之间的相互关系考虑还是单独考虑某个q和结果的关系?后者
- 长度是k的回文数字有啥特性?前一半数字是固定的,half = k + 1 >> 2, str[num][:half]
- 以上性质和q有啥关系?前一半数字可以通过q构造出来。base = 10 ** (half - 1) - 1,比如k=5, half=2,base = 99,第1小的3位数字是100,构造出第1小的5位是100001;
- 奇偶不同会影响啥?(1)half的长度,(2)构造出来前一半后恢复会原来数字的方式
- 为啥奇偶不同不会影响前半部分的大小,毕竟位数不一样?对给定的k,前半部分half也是相同的,大家比的位数是一样的
- 有没有不存在的可能,如何考虑?有,比如q很大,不存在;base + q不能超过位数的限制,也就是base + q 最大是 10 ** half - 1
代码
class Solution:
def kthPalindrome(self, queries: List[int], intLength: int) -> List[int]:
half = (intLength + 1) // 2
base = 10 ** (half - 1) - 1
limit = 10 ** half - 1
def recover(intLength, num):
if intLength % 2 == 0:
return int(str(num) + str(num)[::-1])
else:
return int(str(num)[:-1] + str(num)[::-1])
ans = []
for q in queries:
num = base + q
if not num > limit:
ans.append(recover(intLength, num))
else:
ans.append(-1)
return ans
总结
- 利用回文的性质找前一半,满足严格增的关系
- 利用q和base构造出前一半,注意有上限
- 恢复前一半