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 = \begi…
将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=102intLength−1
最后,左半边回文为:
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