[Leetcode] 564. 寻找最近的回文数
题目链接:https://leetcode-cn.com/problems/find-the-closest-palindrome
分析:
是一道数学题。
距离最近的回文子串,总计三种可能情况。一是左半边拷贝到右半边,二是中间为0,则一半减一,再拷贝,三是中间为9,则一半加一,再拷贝。还有一些特殊情况。针对三位数,最近回文串范围一定在[99,1001]之间,则再加上两种情况。总共五种,减去与自身重复的选项。放进set。找到diff最小,若相同,则数值较小的结果,再输出。
Python
class Solution:
def nearestPalindromic(self, n: str) -> str:
ans_set = set()
p1 = pow(10, len(n)-1)-1
p2 = pow(10, len(n))+1
ans_set.add(p1)
ans_set.add(p2)
mid = len(n)//2
for i in [-1, 0, 1]:
temp = str(int(n[: mid+(len(n)&0x01)])+i)
ans_set.add(int(temp + temp[-1-(len(n)&0x01)::-1]))
ans_set.discard(int(n))
mindiff = float('inf')
res = n
for i in ans_set:
if abs(int(n) - i) < mindiff:
mindiff = abs(int(n) - i)
res = str(i)
elif abs(int(n) - i) == mindiff:
res = str(min(i, int(res)))
return res