Find the Closest Palindrome(模拟暴力太久没做题了失败的回顾)

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.

题意: 给你一个整数找到与它差值最近的回文字符串,不能是本身。
太久没做题了,真的生疏错误一堆。。。。。

AC 代码 做个记录:

class Solution {
public:
    void is(string &n) {
        auto id = n.size()/2;
        for (; id < n.size(); ++id)
            n[id] = n[n.size()-id-1];
        return;
    }
    string nearestPalindromic(string n) {
        if (n.size() == 1) {
            n[0] = (n[0] == '0'?'1':n[0]-1);
            return n;
        }
        string k(n.size()-1, '9'), kss(n.size(), '9') ;
        if (kss == n) {
            string kss(n.size()+1, '0');
            kss[0] = kss[kss.size()-1] = '1';
            return kss;
        }
        if (n[0] == '1') {
            int is = 0;
            for (auto i : n)
                if (i >= '1') is++;
            if (is == 2 && *(n.end()-1) == '1') is --;
            if (is == 1) {
                return k;
            }
        }
        k = n;
        is(n);
        string s1 = n, s2 = n;
        sub(s1, -1);
        sub(s2, 1);
//        cout << n << " " << s1 << " " << s2 << endl;
        long long kk = stoll(k), ss1 = kk-stoll(s1), ss2 = stoll(s2)-kk, tm = abs(kk-stoll(n));
        ss2 = min(ss1, ss2);
        if (ss2 == ss1)
            kss = s1;
        else
            kss = s2;
        if (n == k)
            return kss;
//        cout << ss2 << " " << tm << endl;
        if (ss2 > tm)
            return n;
        else if (ss2 == tm)
            return min(kss, n);
        else return kss;
    }
    void sub(string &t, int k) {
        auto ks = t.size();
        if (ks%2 == 0) ks--;
        auto &tmp = t[ks/2];
        tmp += k;
//        cout << t[ks/2] << " " << k <<endl;
        if (tmp < '0') {
            tmp = '9';
            auto i = ks/2-1;
            for (; t[i] == '0'; --i)
                t[i] = '9';
            t[i]--;
        }
        if (tmp > '9') {
            tmp = '0';
            int i = ks/2-1;
            for (; t[i] == '9' && i >= 0; --i)
                t[i] = '0';
            if (i == -1)
                t = '1'+t;
            else t[i]+=1;
        }
        is(t);
        return;
    }
};
发布了74 篇原创文章 · 获赞 29 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/ClonH/article/details/104559043