[Leetcode] 564. Find the Closest Palindrome 解题报告

Posted 魔豆Magicbean

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Leetcode] 564. Find the Closest Palindrome 解题报告相关的知识,希望对你有一定的参考价值。

题目

Given an integer n, find the closest integer (not including itself), which is a palindrome.

The 'closest' is defined as absolute difference minimized between two integers.

Example 1:

Input: "123"
Output: "121"

Note:

  1. The input n is a positive integer represented by string, whose length will not exceed 18.
  2. If there is a tie, return the smaller one as answer.

思路

和n最接近的回文数根据位数划分,则只有3种可能:

1:比n多1位的数,例如对于99而言,距离它最近的回文数就是101;

2:比n少1位的数,例如对于101, 距离它最近的回文数就是99;

3:和n位数一样,并且其后一半是n的前一半的翻转的数。这样的数又可以分为3种:1)中间数和n相同的,例如123的最近回文数就是121;2)中间数比n大1,例如189的最近回文数就是191;3)中间数比n小1,例如920的最近回文数就是919。

所以只要把这5个数分别计算出来,然后比较哪一个和n最接近即可。

代码

class Solution 
public:
    string nearestPalindromic(string n) 
        int l = n.size();
        set<long> candidates;
        // biggest, one more digit, 10...01
        candidates.insert(long(pow(10, l)) + 1);
        // smallest, one less digit, 9...9 or 0
        candidates.insert(long(pow(10, l - 1)) - 1);
        // the closest must be in middle digit +1, 0, -1, then flip left to right
        long prefix = stol(n.substr(0, (l + 1) / 2));
        for ( long i = -1; i <= 1; ++i ) 
            string p = to_string(prefix + i);
            string pp = p + string(p.rbegin() + (l & 1), p.rend());
            candidates.insert(stol(pp));
        
        long num = stol(n), minDiff = LONG_MAX, diff, minVal;
        candidates.erase(num);                  // cannot be itself
        for ( long val : candidates ) 
            diff = abs(val - num);
            if ( diff < minDiff ) 
                minDiff = diff;
                minVal = val;
            
        
        return to_string(minVal);
    
;

以上是关于[Leetcode] 564. Find the Closest Palindrome 解题报告的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 564. Find the Closest Palindrome 锛堟瀯閫狅級

564. 寻找最近的回文数

#Leetcode# 997. Find the Town Judge

LeetCode: Find the Duplicate Number

LeetCode 997. Find the Town Judge

Leetcode: Find the Difference