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; }