LeetCode 刷题记录[简单]——(7)整数反转

题目描述

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

示例 1:

输入: 123
输出: 321
示例 2:

输入: -123
输出: -321
示例 3:

输入: 120
输出: 21
注意:

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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-integer

解题思路

首先,最直接的想法是:利用对10取余和整除,从右到左把每一位数提取出来,再重新拼接成我们需要的反转形式。

1234
取余:1234%10=4
整除:1234/10=123
拼接:4

取余:123%10=3
整除:123/10=12
拼接:4*10+3=43

取余:12%10=2
整除:12/10=1
拼接:43*10+2=432

取余:1%10=1
整除:1/10=0
拼接:432*10+1=4321

可以看到,当整除的结果为0的时候,应该停下,此时也得到了我们想要的结果4321。

对于负数和末尾带0的情况,以上的思路一样适用,可以自行验证。

那么接下来就要考虑题目的额外要求:反转后的数值范围 [−231, 231 − 1],上溢或下溢时返回0。
上下限具体数值为:
-231 = - 2147483648
231-1 = 2147483647
我们要做的就是判断结果是否处于范围内,直接用if语句即可完成。但是这里有一个陷阱,如果你在最后才判断结果是否符合范围,在运行过程中就会溢出导致错误,因为int本身就不能存储太大的数值,而如果使用long int,未免又有作弊的嫌疑,因此我们需要在转换的过程中就进行判断,如果不符合,直接返回0

下面直接给出运行代码。

运行代码

int reverse(int x) {
        int min = - 2147483648;
        int max = 2147483647;
        int result = 0, t=0;
        int num = x;
        while(num != 0){
            
            t = num%10;       //取余
            num = num/10;     //整除     
            if(result<min/10 || result==min/10 && t<-8){  //判断下溢
                return 0;}
            if(result>max/10 || result==max/10 && t>7){   //判断上溢
                return 0;
            }
            result = result*10 + t;  //拼接
        }
        
        return result;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值