LeetCode——寻找最近的回文数 C++

        本题的主要思路为首先在原序列的二分位处截断,在右边制造同等长度回文数,比如“123”在2处截断制造为“121”,但是有许多特殊情况,比如“10”的最近回文数不是“11”而是“9”。所以本题目需要分六种情况讨论。

1.在原序列的二分位截断后直接制造回文数。

2.在原序列的二分位截断后加1再制造回文数。

3.在原序列的二分位截断后加1再制造回文数。

4.制造与原序列相同位数的“9”序列,如“99999”。

5.制造与原序列少一位数的“9”序列。

6.制造101序列,如“10000001”。

然后将这几种序列分别与原序列相减并测试哪一种绝对值最小。

        完整代码如下:

string nearestPalindromic(string n) {
        long a=stol(n);
        vector<string>s;
        string x,x1,x2,v1,v2,v3,v4="9",v5,v6,res;
        x=n[0]-1;
        x1=n[0];
        x1+=x1;

        for(int i=0;i<=(n.size()-1)/2;i++)x2+=n[i];
        v1=x2;
        v2=to_string(stol(x2)-1);
        v3=to_string(stol(x2)+1);
        int j=(n.size()-1)/2;
        if(n.size()%2)j--;
        for(;j>=0;j--){
            v1+=v1[j];
            v2+=v2[j];
            v3+=v3[j];
        }
        s.push_back(v1);
        s.push_back(v2);
        s.push_back(v3);
        for(int i=1;i<n.size();i++)v4+="9";
        s.push_back(v4);
        if(v4.size()>1)s.push_back(v4.substr(0,v4.size()-1));
        for(int i=0;i<n.size();i--){
            if(i==0||i==n.size()-1)v5+="1";
            else v5+="0";
        }
        s.push_back(v5);
        long num=INT_MAX;
        
        for(int i=0;i<s.size();i++){
            if(s[i]!=""&&abs(a-stol(s[i]))<=num&&abs(a-stol(s[i]))!=0){
                if(abs(a-stol(s[i]))==num){
                    int u=min(stol(res),stol(s[i]));
                    res=to_string(u);
                    continue;
                }
                num=abs(a-stol(s[i]));
                res=s[i];
            }
        }
        return res;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值