如果字符串本身是回文的,那么取中间值,+1或者-1,然后反转前缀,拼接起来进行对比
一些特殊的数字,比如10001,999等特殊判断
如果不是回文的,那么对于长度为奇数的串,取前缀【0,len+1】,对它进行+1或者-1或者不变,后缀由【0,len】翻转,把它们拼接,然后对比;对于长度为偶数的串,前缀为[0,len]
class Solution {
private:bool checkTen(string s){if(s[0] == '1' && stol(s.substr(1, s.size())) == 0)return true;else return false;}bool check(string s){int l = 0, r = s.size()-1;while(l < r){if(s[l] != s[r]) return false;l++;r--;}return true;}
public:string nearestPalindromic(string n) {int len = n.size();long val = stol(n);string res;if(n == "11"){res = "9";return res;}if(stol(n) <= 10){res = to_string(stol(n) - 1);return res;}// 本身是回文if(check(n)){ string c(1,n[len/2]);string tmp1 = "", tmp2 = "";string c1, c2;//如果中间位是0或者9,有可能是10001或者999之类的if(c == "0" || c == "9"){tmp1 = to_string(stol(n) - 1);tmp2 = to_string(stol(n) + 1);if(checkTen(tmp1)){res = to_string(stol(n) - 2);return res;}if(checkTen(tmp2)){res = to_string(stol(n) + 2);return res;}} c1 = to_string(stol(c) + 1);c2 = to_string(stol(c) - 1);//如果长度是奇数if(len % 2){tmp1 = n.substr(0, len/2) + c1 + n.substr(len/2+1, len/2);tmp2 = n.substr(0, len/2) + c2 + n.substr(len/2+1, len/2);}//如果长度是偶数else{if(len == 2){tmp1 = c1 + c1;tmp2 = c2 + c2;}else{tmp1 = n.substr(0, len/2) + c1 + c1 + n.substr(len/2+1, len/2);tmp2 = n.substr(0, len/2) + c2 + c2 + n.substr(len/2+1, len/2);} }long t1 = stol(tmp1);long t2 = stol(tmp2);if(abs(t1-val) < abs(t2-val)) res = tmp1;else res = tmp2;}//如果是10, 100,1000这种else if(checkTen(n)){res = to_string(stol(n) - 1);return res;}//不是回文,有三种情况else{string left, right;// 分别是+1 -1 不变string tmp1, tmp2, tmp3;string l1, l2, l3, r1, r2, r3;long t1, t2, t3;// 长度是奇数if(len % 2){left = n.substr(0, len/2 + 1);right = left.substr(0, len / 2);reverse(right.begin(), right.end());l1 = to_string(stol(left) + 1);r1 = l1.substr(0, len / 2);reverse(r1.begin(), r1.end());l2 = to_string(stol(left) - 1);r2 = l2.substr(0, len / 2);reverse(r2.begin(), r2.end());tmp1 = l1 + r1;tmp2 = l2 + r2;tmp3 = left + right;}//长度是偶数else{left = n.substr(0, len/2);right = left;reverse(right.begin(), right.end());l1 = to_string(stol(left) + 1);r1 = l1;reverse(r1.begin(), r1.end());l2 = to_string(stol(left) - 1);r2 = l2;reverse(r2.begin(), r2.end());tmp1 = l1 + r1;tmp2 = l2 + r2;tmp3 = left + right;}//cout << tmp1 << " " << tmp2 << " " << tmp3 << endl;t1 = stol(tmp1);t2 = stol(tmp2);t3 = stol(tmp3);long d1 = t1 - val;long d2 = val - t2;long d3 = abs(t3 - val);//cout << d1 << " " << d2 << " " << d3 << endl;if(d1 < d2 && d1 < d3) res = tmp1;else if(d2 < d1 && d2 <= d3) res = tmp2;else res = tmp3;} return res;}
};