LeetCode:第二天-整数反转关于int上限问题。

题目:
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

关于这题一开始我觉得很简单,以为就是把每个数取出来,然后再反过来相加,然后发现有正负数的问题,还专门讨论了是否为正,下面为开始的有问题的代码

class Solution {
public:
    int reverse(int x) {
       int a=x;
        int s=0;
        if(x<0)
            a=-x;
        while(a>0){
            
            s=s*10+a%10;
            a/=10;
        }
        if(x>0)
            return s;
        else 
            return -s;
    }
};

这个看起来使用123或者-123这样的可以实现反转,但是发现测试用例有错误,如:1534236469 反转之后会导致溢出,按照题目要求,应该是返回0;
然后想了一下判断了一下最后那个值是否大于INT_MAX发现不对。因为此时已经溢出,于是推理到判断前面一次是否大于INT_MAX/10还是有问题,没有考虑清楚就比如假设intmax为1234
那么如果前一次为123的话,而剩下的一位是5,那么12310之后+5还是溢出了,所以当前一次的数值=INT_MAX/10时,要考虑具体的最后一位小于INT_MAX%10(相当于取INT_MAX的个位)如下面代码的pop<7一样。。但是还是有问题。
我上面的代码全部把x看成正数处理,然后判断正负号。但是最小的下限也就是INT_MIN的数值部分是比INT_MAX多1的。所以要分类讨论。
最后看了官方的答案,才发现自己想多了,其实根本不用判断正负号,因为当负数时,如-123。从前开始取位数就是-3
10*10+(-2)*10+(-1),而负数取模还是负的。(其他语言好像不一样)。所以和123的规则是一样的。。所以最后官方代码如下

class Solution {
public:
    int reverse(int x) {
        int pop;
		int temp=0;
		while(x!=0){
			pop=x%10;
            x/=10;
			
			if(temp>INT_MAX/10|temp==INT_MAX/10&pop>7)
				return 0;
			if(temp<INT_MIN/10|temp==INT_MIN/10&pop<-8)
				return 0;
			temp=temp*10+pop;
			
    	}
    		return temp;
    	
    }
};

其中

if(temp>INT_MAX/10|temp==INT_MAX/10&pop>7)

if(temp<INT_MIN/10|temp==INT_MIN/10&pop<-8)

两个判断比较重要!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值