文章

2217. 找到指定长度的回文数(Rating 1822)

2217. 找到指定长度的回文数(Rating 1822)

以下内容偏向于记录个人练习过程及思考,非常规题解内容

题目

2217. 找到指定长度的回文数

Rating 1822

思路

找规律,回文数通常只需要考虑一半

  • intLength为1时
    • 序列为:1,2,3,4,5,6,7,8,9
    • 一半为:1,2,3,4,5,6,7,8,9
    • 总数量:9 - 1 + 1 = 9
  • intLength为2时
    • 序列为:11,22,33,44,55,66,77,88,99
    • 一半为:1,2,3,4,5,6,7,8,9
    • 总数量:9 - 1 + 1 = 9
  • intLength为3时
    • 序列为:101,111,121,131,141,…,999
    • 一半为:10,11,12,13,14,…,99
    • 总数量:99 - 10 + 1 = 90
  • intLength为4时
    • 序列为:1001,1111,1221,1331,1441,…,9999
    • 一半为:10,11,12,13,14,…,99
    • 总数量:99 - 10 + 1 = 90

按规律代码即可。

  • 注意当intLength=1时,最小的回文数是1不是0
  • 注意queries有可能超过回文数数量,此时需要根据总数量判断一下,超出时返回-1

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution:
    def kthPalindrome(self, queries: List[int], intLength: int) -> List[int]:
        n = len(queries)
        ret = [0] * n
        b = (intLength + 1) // 2
        mx = 9 * 10 ** (b - 1) # 总数量规律
        for idx, q in enumerate(queries):
            if q > mx: # 超出数量
                ret[idx] = -1
                continue
            num = 10 ** (b - 1) + q - 1 # 回文数一半
            m = num
            if intLength % 2 > 0:
                m //= 10
            while m: # 补全另一半
                num = 10 * num + (m % 10)
                m //= 10
            ret[idx] = num
        return ret
本文由作者按照 CC BY 4.0 进行授权