[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
posted @ 2020-10-12 21:02  我的小叮当  阅读(173)  评论(0编辑  收藏  举报