找到指定长度的回文数
给你一个整数数组 queries 和一个 正 整数 intLength ,请你返回一个数组 answer ,其中 answer[i] 是长度为 intLength 的 正回文数 中第 **queries[i] 小的数字,如果不存在这样的回文数,则为 -1 。
回文数 指的是从前往后和从后往前读一模一样的数字。回文数不能有前导 0 。
示例 1:
输入: queries = [1,2,3,4,5,90], intLength = 3
输出: [101,111,121,131,141,999]
解释:
长度为 3 的最小回文数依次是:
101, 111, 121, 131, 141, 151, 161, 171, 181, 191, 201, ...
第 90 个长度为 3 的回文数是 999 。
示例 2:
输入: queries = [2,4,6], intLength = 4
输出: [1111,1331,1551]
解释:
长度为 4 的前 6 个回文数是:
1001, 1111, 1221, 1331, 1441 和 1551 。
提示:
1 <= queries.length <= 5 * 1041 <= queries[i] <= 1091 <= intLength <= 15
from copy import copy
from math import ceil
class Solution:
def kthPalindrome(self, queries: List[int], intLength: int) -> List[int]:
max_palindrome_index = 0
if intLength % 2 == 0:
max_palindrome_index = 10 ** (intLength/2-1) * 9
else:
max_palindrome_index = 10 ** ((intLength-1)/2) * 9
res = []
for q in queries:
if q > max_palindrome_index:
res.append(-1)
else:
res.append(self.make_number(q, intLength))
return res
def make_number(self, q, l):
x = q - 1
p = ceil(l/2)
w = str(x).zfill(p)
r = ''
for i in range(p):
if i == 0:
r = str(int(w[i]) + 1)
else:
r = r + w[i]
s = copy(r)
s = s[::-1]
if l % 2 == 1:
s = s[1:]
print(r, s)
return int(r + s)
经过分析,其实就是找到数字长度为intLength的回文数字都有哪些,按照从小到大,选出第queries[i]个即可。
可以发现,当数字长度为 1 的时候,就只有1-9这9个数字,当数字长度为2的时候,也只有11,22,33,44,55,66,77,88,99,跟0没有关系,只有当数字长度从3往上,有可能把0加入进来。
因为是回文数字,可以对半看,这样长度为1或2的时候,左边只有1-9,长度为3或4的时候,左边是有两位,高位1-9低位0-9,同样的,再往上增加长度,也只是继续添加中间的0-9即可,这样就可以计算出来,对于一个给定长度的intLength,能够出现的回文数字总数量是有限的,最多有多少个,是max_palindrome_index个,由
if intLength % 2 == 0:
max_palindrome_index = 10 ** (intLength/2-1) * 9
else:
max_palindrome_index = 10 ** ((intLength-1)/2) * 9
计算得出。
由此可以知道,当queries[i]超过了上限,就可以直接输出-1。
当没有超过上限的时候,就可以直接根据数学规则,把指定回文数字的前半段拼出来,再根据总数位是奇数还是偶数,把字符串逆序拼接一下就可以了。