LC-2217找到指定长度的回文数

LC-2217找到指定长度的回文数

这道题是一个找规律的题型,仔细观察可以发现示例中输出的中间的数字貌似和上面的queries的数字有关系,例如1 - 101、2-111,可以发现输出的中间的数字和queries对应的差一。再观察第二个示例,这时验证了上面的想法,同时想到需要将输出拆成一般来对应,这样就更好找到相应的关系了,即11, 13, 15 分别对应了2, 4, 6,可以看到后面的个位数(没拆开时中间的数字)是相差1。

但是因为0不能当做前导,所以queries大于中间所能表示的数字时,例如三位回文数范围在第一个数为1的时候,范围为101-191,只能表示10个数,第十一个数字这时候需要前面加1,为202,也就是说最开始就因为前导不为0相差了一个基数。

那么这个基数怎么表示呢?

实际上我们可以看到因为是回文数,我们只观察一半,其实就是这一半的位数的最小值。

  • intLength=3, 101拆开 10 | 1, base=10
  • intLength=4, 1001 拆开 10 | 01, base=10
  • intLength=5, 10001 拆开 100 | 01,base=100

进一步总结:
KaTeX parse error: No such environment: equation at position 8: \begin{̲e̲q̲u̲a̲t̲i̲o̲n̲}̲ base = \b…
intLength奇偶数整合到一起:
b a s e = 1 0 i n t L e n g t h − 1 2 base = 10 ^ {\frac{intLength - 1}{2}} base=102intLength1
最后,左半边回文为:
b a s e + q u e r i e s [ i ] − 1 base + queries[i] - 1 base+queries[i]1
反转这个数,然后拼接到它的后面,就是第queries[i]个长度为intLength的回文。

这里有一个处理细节,就是如果是奇数,在反转前把地位数字去掉。

根据题目,如果超过了最大能表示的,就输出-1,最大的值其实就是 9 × b a s e 9 \times base 9×base ,原因如下,可见三位数到999后,只有90个。


(queries[i],回文数)

(1, 101) (10, 191)

(11, 202) (20,292)

(81, 909) (90, 999)


代码如下:

class Solution:
    def kthPalindrome(self, queries: List[int], intLength: int) -> List[int]:
        n = (intLength - 1) // 2
        base = 10 ** n
        ans = []

        for num in queries:
            if num > 9 * base:
                ans.append(-1)
                continue
            else:
                num_str = str(base + num - 1)
                num_str2 = num_str[:-1][::-1] if intLength % 2 else num_str[::-1]
                tmp = num_str + num_str2

            ans.append(int(tmp))
        return ans

欢迎访问

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

请叫我哈士奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值