算法每日一题打卡(第三天)————整数翻转

题目:

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。

示例 1:   输入:x = 123    输出:321

示例 2:   输入:x = -123   输出:-321

代码如下:

// 整个算法主要是先取余,把余数当高位得到结果

// 但这里难理解的是如和判断是否在范围内
//在while 这个循环中,有一个if语句,判断conut的大小即判断翻转后的数值是否符合要求
//conut在最大数(最小数)的1/10就可以判断了,因为若count>INT_MAX,必定会溢出。
int reverse(int x){
    int count = 0;
    while(x != 0 )
    {
        if(count < INT_MIN/ 10 || count > INT_MAX / 10)        //INT_MIN和INT_MAX在C/C++中是常量,表示最大和最小整数
        {
            return 0;
        }
        count = count * 10 + x % 10 ;
        x = x / 10 ;
        
    }
    return count;
}

         在这一题中,整个算法并不算太难想到,就是先取余再把余数当高位得到结果。

        但我在这一题卡住的是,如何去判断这个数是否溢出了,如果溢出了要返回0。但后来我再仔细看这代码才发现,while循环中for语句的判断是——

if(count < INT_MIN/ 10 || count > INT_MAX / 10)

判断的是count的值,即翻转后的值,所以不必考虑翻转前的数是否会溢出。其实如果真的超过最大值了,根本就不会存到x中,不需要考虑这个问题。

 所以,要考虑的是翻转后的count值是否会溢出。我们可以直接判断最大值(最小值)的1/10。比如说最大值(2147483647)到倒数第二位是4,当count最后一位大于4时,必定会溢出。而若是2147483642至2147483647这几个数翻转前就是溢出的数了,所以会直接pass掉,而2147483641这个数小于最大值,原本也符合条件,在If条件语句中也符合。

综上所述,if判断语句可以写为上面的式子。


自己也在写这个的时候把if语句中的判断语句彻底想明白了,耶!

<完> 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值