leetcode7 求给定int值的逆置数

题意:给定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
Input: -2147483648
Output: -1053782004
Expected: 0


也就是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);
    	}
    }
};



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值