思路:因为昨天做的题涉及到了将整形转换为字符串的函数,所以今天自然而然想到转换成字符串来处理。
难点:在于最后几个案例,一直在卡,就是字符串如果再转回整形需要与int比较的问题。但这里思考漏了一个地方就是int 最大表示为2147483647 有的字符串转回来就会溢出,以前很少解决这样的问题,不太熟。
1、先将字符反转并分情况讨论(正数、0、负数)且考虑到后期将字符串转化为整形的函数是会直接去掉前面的0的,所以此处不用去掉前面可能出现的0(类似于-0012这种)。
string s = to_string(x);
if(s[0]=='-'){//是负数的情况
res += '-';
//对s进行翻转
for(int i = s.length() -1;i>=1;i--){
res +=s[i];
}
}else if(s[0] == '0'&&s.length()==1){//是s = "0"的情况 cout<<s<<endl;
res = "0";
}else{//是正数的情况
for(int i=s.length()-1;i>=0;i--){
res +=s[i];
}
}
2、对于[-2^32,2^32-1] 的处理
(1)尝试过用移位的方式,但写出来是这种效果
cout<<(2<<30)<<endl;//-2147483648
cout<<(2<<31)<<endl;//0
(2)只有硬表示(2147483647) 这段代码是为了题目里那个范围超出时返回0
string jg = res;//jg 用于判断是否是负数
int flag = 0;
if(jg[0]=='-') {
jg.erase(0,1);flag = 1;//除去负号
}
if(jg.length()>10){
return 0;
}else if(jg.length()==10) {
long long temp = atoll(jg.c_str());
if(flag&&temp>=2147483647){//负数
return 0;
}else if(!flag&&temp>=2147483647){//正数
return 0;
}
}
(3)正常返回,用到了string转long函数
return atol(res.c_str());
全部代码
class Solution {
public:
string res;
int reverse(int x) {
string s = to_string(x);
if(s[0]=='-'){//是负数的情况
res += '-';
//对s进行翻转
for(int i = s.length() -1;i>=1;i--){
res +=s[i];
}
}else if(s[0] == '0'&&s.length()==1){//是s = "0"的情况 cout<<s<<endl;
res = "0";
//return 0;
}else{//是正数的情况
for(int i=s.length()-1;i>=0;i--){
res +=s[i];
}
}
string jg = res;//jg 用于判断是否是负数
int flag = 0;
if(jg[0]=='-') {
jg.erase(0,1);flag = 1;//除去负号
}
if(jg.length()>10){
return 0;
}else if(jg.length()==10) {
long long temp = atoll(jg.c_str());
if(flag&&temp>=2147483647){//负数
return 0;
}else if(!flag&&temp>=2147483647){//正数
return 0;
}
}
return atol(res.c_str());
}
};