C++算法实践06-整数反转

一、题目:

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。

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

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

示例 3:输入:x = 120 输出:21

示例 4:输入:x = 0 输出:0

二、思路:

对于整数的反转来说,只需要循环取出最后一位数字,并且每一次都对原来的数字和10取整,直到原来的数字为0跳出循环。对于取出的数字只需要将前一次的乘以10加上这次就完成了翻转。

比如:

12345 取出最后一位数为5 // 0*10+5=5 // 12345/10=1234

1234 取出最后一位数为4 // 5*10+4=54 // 1234/10=123

123 取出最后一位数为3 // 54*10+3=543 // 123/10=12

12 取出最后一位数为2 // 543*10+2=5432 // 12/10=1

1 取出最后一位数为1 // 5432*10+1=54321 // 1/10=0

然而问题的关键在于题目所说的翻转后的溢出问题。32位的整型的最大值位2147483647,但是如果以这个数为判断边界,当倒数第二次翻转后的数字大于214748364后再乘以10就会溢出int的最大数导致代码崩溃。所以我们需要以214748364为判断边界。

只要数字小于214748364,就不会出现溢出问题。但是当数字等于214748364就还需要考虑一种情况。由于214748364乘以10还需要加上最后一个数字,当最后一次提取尾数的值大于7就会出现溢出问题,只要最后一次尾数的值小于7就不会出现溢出。

三、代码:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值