LeetCode #564 - Find the Closest Palindrome

本文介绍了一种高效算法,用于找到与给定整数最接近的回文数。通过确定上界和下界,以及修改目标数的前半部分,生成可能的回文数,并从中选择距离目标数最近的一个。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

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.

需要找和目标值最接近的回文数,那么其实只需要考虑五个数即可。首先是上界和下界,根据目标值的位数可以确定,然后截取目标数的前半段得到half_num,分别加上-1,0,1,再凑成回文数,之后再判断这五个数中到底哪个是最接近目标值的回文数。

class Solution {
public:
    string nearestPalindromic(string n) {
        //假设n="12345"
        int len=n.size();
        unordered_set<long long> s;
        long long a=pow(10,len)+1; //a=100001,上界
        long long b=pow(10,len-1)-1; //b=9999,下界
        s.insert(a);
        s.insert(b);
        long long num=stoll(n);
        string half=n.substr(0,(len+1)/2); //half="123"
        long long half_num=stoll(half);
        for(int i=-1;i<=1;i++)
        { //分别得到12221,12321,12421
            long long left_num=half_num+i;
            string left=to_string(left_num);
            string right=left;
            reverse(right.begin(),right.end());
            if(len%2==0) s.insert(stoll(left+right));
            else s.insert(stoll(left+right.substr(1)));
        }
        
        s.erase(num);//如果n本身为回文数,产生的五个数中会包含它本身,需要删除
        long long min_diff=LONG_LONG_MAX;
        long long result=0;
        for(auto x:s) 
        {
            if(abs(x-num)==min_diff&&x<num) result=x; 
            else if(abs(x-num)<min_diff) 
            {
                result=x;
                min_diff=abs(x-num);
            }
        }
        return to_string(result);
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值