leetCode有溢出限制的整数反转输出

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

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
在这里插入图片描述
原理如图
在这里插入图片描述
每次取出最后一位放入新的变量中尾部,取出操作使用取余运算符,插入尾部操作可以使旧数向前移1位加上新的尾部,即旧数*10+最后一位,得到新的number,直到x=0,即所有位都反转成功。

代码如下

class Solution {
//传入并返回整形参数
    int reverse(int x){
        int number=0;//存放每次转换后的数字
        while(x!=0){
            //此处的new_number为了判断溢出而创建
            int new_number = number * 10+x % 10;
            //此条件判断溢出,因为int类型占4个字节内存,不带符号位为31个二进制位,
            //假设发生了溢出,数据肯定出现错误,无法复原成与原来相同的数据。
            if((new_number - x % 10)/10 != number)
                return 0;
            //调整位置,循环转换最后一位
            number = new_number;
            x = x/10;
        }
        return number;//没有溢出返回最后循环结束的反转整数
    }
}

PS:判断溢出条件处利用了int数据类型8个字节,刚好可以表示31位有符号数的特点,一旦产生溢出数据就会发生错误,举个简单的例子:
一个字节最大可以表示无符号数11111111,当随便加上一个数字发生了溢出,一定就会变成一个比他本身小的数,所以无法通过减去刚刚加上的数恢复到原来的数字,即数据发生了错误,也就是溢出。

测试结果:
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值