题意:给定123 输出321 ;给定-123,输出-321
首先强调下 int 的范围 -2147483648~2147483647
几次都陷入陷阱。
第一次提交代码:
<span style="font-size:14px;">class Solution {
public:
int reverse(int x) {
vector<int> vec;
int ans=0,i=0;
if(x>0){
while(x){
vec.push_back(x%10);//3 2 1
x/=10;
}
ans+=vec[0];
for(i=1;i<vec.size();i++){
ans*=10;
ans+=vec[i];
}
return ans;
}
else if(x<0){
while(abs(x)){
vec.push_back(abs(x)%10);//3 2 1
x/=10;
}
ans+=vec[0];
for(i=1;i<vec.size();i++){
ans*=10;
ans+=vec[i];
}
return 0-ans;
}
else{
return 0;
}
}
};</span>
此时报错如下:
Input:
1534236469
Output:
1056389759
Expected:
0
显然,当执行到ans=964632435,此时还没有溢出,如果继续ans*=10;此时ans肯定会溢出,因此会报错。
因此尝试将ans 改成long long 类型。第二次提交代码如下:
class Solution {
public:
int reverse(int x) {
vector<int> vec;
long long ans=0,i=0;
if(x>0){
while(x){
vec.push_back(x%10);//3 2 1
x/=10;
}
ans+=vec[0];
for(i=1;i<vec.size();i++){
ans*=10;
ans+=vec[i];
}
if(ans>INT_MAX){
return 0;
}
else return (int)ans;
}
else if(x<0){
while(abs(x)){//<span style="font-family: Verdana, Arial, Helvetica, sans-serif;">此处会出现错误,其中当x为最小的负数时,取绝对值后会越界。因此必须用long long 来存</span>
vec.push_back(abs(x)%10);//3 2 1
x/=10;//
}
ans+=vec[0];
for(i=1;i<vec.size();i++){
ans*=10;
ans+=vec[i];
}
if(ans>INT_MAX){
return 0;
}
else return 0-(int)ans;
}
else{
return 0;
}
}
};
此时报错如下:
1031 / 1032 test cases passed.
| Status: Wrong Answer |
Submitted:
37 minutes ago
|
也就是int下边界时出现错误,仔细分析代码,并单步执行发现,
补充点负数的补码知识:计算机中的负数是以其补码形式存在的 补码=原码取反+1
一个字节有8位 可以表示的数值范围在 -128到+127
用二进制表示也就是 10000000 - 01111111(注意:最高位表示符号)
最高位是1的都是负数 最高位是0的都是正数
最后一次修改代码,Acc:
class Solution {
public:
int reverse(int x) {
if(x==0) return 0;
vector<int> vec;
long long ans = 0, i = 0, y = 0;
y = x > 0 ? x : 0-(long long) (x);
while (y){
vec.push_back(y % 10);//3 2 1
y /= 10;
}
ans += vec[0];
for (i = 1; i<vec.size(); i++){
ans *= 10;
ans += vec[i];
}
if (x>0){
return ans > INT_MAX ? 0 : (int)ans;
}
else{
return ans>(long long)(INT_MAX)+1 ? 0 : (0 - (int)ans);
}
}
};