很久没写过题解了,最近为了准备省赛还是刷刷题,最近在准备保研夏令营的事情,希望一切顺利吧
题目:
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.
Example 1:
Input: "123" Output: "121"
Note:
- The input n is a positive integer represented by string, whose length will not exceed 18.
- If there is a tie, return the smaller one as answer.
第一反应很简单,去前面一半,对前面一半取回文之后加在后面,但是这里要注意下面几点
1.数据范围是18位,longlong的数据范围:-9223372036854775807 ~+9223372036854775807 大概是9*10^18范围内,所以能满足本题的数据范围。
但是注意我是用pow(10,i),该函数的返回值是double,所以如果不用(long long)类型转换,数据精度会丢失,需要注意
2.注意本题不能等于自己,同时如果有答案两个相同要返回小的,
3.对于前面一半,+1,0,-1都是可能的答案,而对于-1的情况,比如10,前面一半是1,减一以后是0,取回文加起来的结果就是0,这肯定不对,所以,最后可以统一和9,99,999,...这些边界数判断一下一下是不是答案,只能说leetcode幸好有错误提示,不然这道题肯定A不了,哎,退步太严重,需要加强锻炼
long long getcov(long long q){
long long ans=0;
while(q!=0){
long long t=q%10;
q/=10;
ans=ans*10+t;
}
return ans;
}
long long tt[18];
long long nine[18];
string itos(long long num){
ostringstream is;
is<<num;
return is.str();
}
class Solution {
public:
string nearestPalindromic(string n) {
long long num=0;
int ll=n.length();
long long org=0;
for (int i=0;i<n.length();i++){
org=org*10+(n[i]-'0');
}
tt[0]=10;
long long aaa=9;
for (int i=0;i<18;i++){
if (i!=0) tt[i]=tt[i-1]*10;
if (org==tt[i]){
//cout<<aaa<<endl;
return itos(aaa);
}
else {
nine[i]=aaa;
aaa=aaa*10+9;
}
//cout<<tt[i]<<endl;
}
//cout<<org<<endl;
long long ans=0;
int l=ll/2;
if (ll%2==0){
long long q=0;
for (int i=0;i<l;i++){
q=q*10+n[i]-'0';
}
long long h=getcov(q);
long long a=q*(long long)pow(10,l)+h;
//cout<<" "<<h<<" "<<a<<endl;
if (org!=a)ans=a;
h=getcov(q+1);
a=(q+1)*(long long)pow(10,l)+h;
//cout<<" "<<h<<" "<<a<<endl;
if (abs(a-org)<abs(ans-org)){
ans=a;
}
h=getcov(q-1);
a=(q-1)*(long long)pow(10,l)+h;
//cout<<" "<<h<<" "<<a<<endl;
if (abs(a-org)<=abs(ans-org)){
ans=a;
}
//cout<<ans<<endl;
}
else{
long long q=0;
for (int i=0;i<l;i++){
q=q*10+n[i]-'0';
}
long long h=getcov(q);
long long a=(q*10+ n[l]-'0')*(long long)pow(10,l)+h;
// cout<<q<<" "<<h<<" "<<a<<endl;
if (org!=a)ans=a;
h=getcov((q*10+ n[l]-'0'+1)/10);
a=(q*10+ n[l]-'0'+1)*(long long)pow(10,l)+h;
if (abs(a-org)<abs(ans-org)){
ans=a;
}
h=getcov((q*10+ n[l]-'0'-1)/10);
a=(q*10+ n[l]-'0'-1)*(long long)pow(10,l)+h;
if (abs(a-org)<=abs(ans-org)){
ans=a;
}
}
for (int i=0;i<18;i++){
if (nine[i]!=org&&abs(nine[i]-org)<abs(ans-org)){
ans=nine[i];
}
}
return itos(ans);
}
};