【 7. 整数反转】 LeetCode

题目描述:

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1:

输入: 123
输出: 321

 示例 2:

输入: -123
输出: -321

示例 3:

输入: 120
输出: 21

注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231,  231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

 

class Solution {
public:
    int fun(int x){   //计算x的位数
	int num=0;
	while(x!=0){
		num++;	
		x=x/10;
	}
	return num;
}

int reverse(int x) {
    /*限制条件:
    x>0时,只要是大于1563847412,那么反转过来的数会大于2147483647
    x<0时,情况比大于0时复杂,所以直接判断是否小于等于-2147483647(主要是为了应对x=-2147483648 的情况)
    */
        if(x<=-2147483647||x>=1563847412){    
            return 0;
        }
        bool flag=1;     //判断x是否为正数的标志位
        if(x<0){
            flag = 0;
        }
        int m=0;
        int temp;
        if(x%10==0){    //如果x的尾数为0则舍去,因为尾数0反转后会出错
        	x=x/10;
        }
        int n = fun(x);    //计算x的位数,方便计算反转后的数
        
        while(n!=0&&x!=0){   //根据x的位数和x的值进行反转,用 m 积累
            temp=x%10;
            if(temp<0){
                temp*=-1;
            }
            if(n!=0){                          //注意: pow()函数返回值为double,如果直接返回给一个整数,会出现数据丢失情况!!!
            	double kk = temp*pow(10,n-1);  //计算出每一位数反转后的值
                if(2147483647-m<kk){      //判断是否会溢出
                    return 0;
                }
            	m += (int)kk;     //累加到 m 
            }
            x=x/10;    // x减少一位
            n--;       // 位数减少一位
        }
        if(m>2147483647){    //判断是否溢出
        	return 0;
        }
        if(!flag){           //如果为x为负数,则转换回负数
            m=m*(-1);
        }
         
        if(m<(-2147483648)){    //判断是否溢出
        	return 0;
        }
        
        return m;
}

};

 

提交结果:

 

这道题虽然是绿色题,但是我花了近3个小时才写出来。。但是最后显示用时还算理想就感觉辛苦没白费QAQ 。处理溢出部分实在是太让我头疼了,想用异常处理的,但对于数据溢出的情况C++的异常是检测不出来的。。感觉自己要补的功课还有很多。

 

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------时间:2019年4月12日20:58:51

过了一周回来看看这题,感觉自己写的代码好傻。首先,根本不需要计算位数,不断除10取余,把余数乘10累加就好了。其次,所有直接判断数据溢出的操作都是无用的,如果数据溢出的话程序会直接炸掉的,而且也不可能输入超过 int 整型数据的最大值 2147483647 的数。所以,改进了一下代码。

class Solution {
public:
int reverse(int x) {
        
        if(x<=-2147483647||x>=1563847412){
            return 0;
        }
        bool flag=1;
        if(x<0){
        	x=x*(-1);       //如果是负数,则先换成正数方便计算,反转完成后再*-1
            flag = 0;
        }
        int m=0;
        int temp;
        while(x){
        	temp=x%10;
            if(214748364<m){     //最核心的判断 :如果当前 m值 > 溢出值/10 ,那么代表下一步操作m值将溢出
                    return 0;
                }
        	m=10*m+temp;
            x=x/10;
        }
        if(!flag){
            m=m*(-1);
        }
        
        return m;
  }
};

运行结果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值