LeetCode-564 寻找最近的回文数

简介: LeetCode-564 寻找最近的回文数

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/find-the-closest-palindrome

题目描述


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

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

 

示例 1:
输入: n = "123"
输出: "121"
示例 2:
输入: n = "1"
输出: "0"
解释: 0 和 2是最近的回文,但我们返回最小的,也就是 0。
提示:
1 <= n.length <= 18
n 只由数字组成
n 不含前导 0
n 代表在 [1, 1018 - 1] 范围内的整数

 

解题思路

一道十分困难的脑经急转弯题。。

关键要想到,每次将字符串前半部分镜像到后半部分得到的数字比将后半部分复制到前半部分构成的字符串更加接近原数。

所以可以确定候选的一些数字分别是由前半部分数字多1,前半部分数字,前半部分数字减1,999……999, 100……001之中。

将这五个数枚举出来,依次判断出非本身外最接近原数的数即可。

代码展示

 

class Solution {
public:
    string nearestPalindromic(string n) {
        int iN = n.size();
        long lSelf = stol(n);
        vector<long> vlN = {(long)pow(10, iN - 1) - 1, (long)pow(10, iN) + 1};
        string strPrefix = n.substr(0, (iN + 1) / 2);
        long lPrefix = stol(strPrefix);
        for(long i: {lPrefix - 1, lPrefix, lPrefix + 1})
        {
            string strTemp = to_string(i);
            string strCandidate = strTemp + string(strTemp.rbegin() + (iN & 1), strTemp.rend());
            vlN.push_back(stol(strCandidate));
        }
        long lRet = -1;
        for(auto iter: vlN)
        {
            if(iter != lSelf)
            {
                if(abs(lSelf - iter) < abs(lSelf - lRet) || abs(lSelf - iter) == abs(lSelf - lRet) && iter < lRet)
                {
                    lRet = iter;
                }
            }
        }
        return to_string(lRet);
    }
};

运行结果

 

相关文章
|
6月前
|
算法 Java
[Java·算法·简单] LeetCode 9. 回文数 详细解读
[Java·算法·简单] LeetCode 9. 回文数 详细解读
95 0
|
6月前
|
Go
golang力扣leetcode 479.最大回文数乘积
golang力扣leetcode 479.最大回文数乘积
41 0
|
C语言
【Leetcode-1.两数之和 -3.无重复字符的最长子串 -9.回文数(C语言)】
【Leetcode-1.两数之和 -3.无重复字符的最长子串 -9.回文数(C语言)】
37 0
|
1月前
|
算法
LeetCode回文数(暴力解,求更好的思路)
这篇博客讨论了如何判断一个整数是否为回文数,提供了暴力解法的代码,并寻求更优的算法建议。
41 1
LeetCode回文数(暴力解,求更好的思路)
|
3月前
|
算法
LeetCode第9题回文数
该文章介绍了 LeetCode 第 9 题回文数的解法,通过分析回文数的特征,只需反转一半数字进行比较即可,时间复杂度可降至 O(n/2),并总结了该题与整数反转有关,需根据回文数特征来解决。
LeetCode第9题回文数
|
6月前
leetcode代码记录(回文数
leetcode代码记录(回文数
40 1
【力扣-TS解题】1、回文数
【力扣-TS解题】1、回文数
50 0
|
6月前
【力扣】9. 回文数
【力扣】9. 回文数
|
6月前
|
算法 Java
[Java·算法·简单] LeetCode 9. 回文数 详细解读
[Java·算法·简单] LeetCode 9. 回文数 详细解读
45 0
|
6月前
|
算法 Java