日渐头秃的代码日记 -- 7 LC第286周赛第三题

154 阅读2分钟

找到指定长度的回文数

给你一个整数数组 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 * 104
  • 1 <= queries[i] <= 109
  • 1 <= 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加入进来。 因为是回文数字,可以对半看,这样长度为12的时候,左边只有1-9,长度为34的时候,左边是有两位,高位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。 当没有超过上限的时候,就可以直接根据数学规则,把指定回文数字的前半段拼出来,再根据总数位是奇数还是偶数,把字符串逆序拼接一下就可以了。