本题的主要思路为首先在原序列的二分位处截断,在右边制造同等长度回文数,比如“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;
}