寻找最近的回文数

题目描述(来源于LeetCode)

给定一个表示整数的字符串 n ,返回与它最近的回文整数(不包括自身)。如果不止一个,返回较小的那个。

“最近的”定义为两个整数差的绝对值最小。

代码实现

初期思路

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution:
    def nearestPalindromic(self, n: str) -> str:
        a= int(n)
        b= int(n)
        max =a
        while 1:
            a+=1
            if str(a)==str(a)[::-1]:
                max=a
                break
        while 1:
            b-=1
            if str(b)==str(b)[::-1]:
                min=b
                break
        if max+min-2*int(n)>=0:
            return str(min)
        else:
            return str(max)

虽然可以实现但如果输入的n很特殊则效率很低

情况改善

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
class Solution:
def nearestPalindromic(self, n: str) -> str:
num = int(n)
len_n = len(n)

if num <= 10:
return str(num - 1)

candidates = set()
candidates.add(10**(len_n - 1) - 1)
candidates.add(10**(len_n) + 1)

half_len = (len_n + 1) // 2
prefix = n[:half_len]
prefix_int = int(prefix)

for p in [prefix_int - 1, prefix_int, prefix_int + 1]:
s_p = str(p)
if len(s_p) != half_len:
continue
if len_n % 2 == 0:
candidate_str = s_p + s_p[::-1]
else:
candidate_str = s_p + s_p[::-1][1:]
candidates.add(int(candidate_str))

if num in candidates:
candidates.remove(num)
min_diff = float('inf')
result = None
for cand in candidates:
diff = abs(cand - num)
if diff < min_diff:
min_diff = diff
result = cand
elif diff == min_diff:
if cand < result:
result = cand
return str(result)

参考昨天做的题19中的思路,先找出范围内的回文数,在进行匹配

复杂度分析

  • 时间复杂度:O(n)O(n)
  • 空间复杂度:O(n)O(n)