整数反转

110 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情

题目描述

给你一个 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  

提示:

-231 <= x <= 231 - 1

思路

取出来每一个数字可以这样操作,原数字设置为x=1234,然后x模10就可以得到最后一个数字即4,取出来后再除以10就可以把刚刚得到的4删掉;如此反复下去,就可以把每一位数字提取出来。

然后就是把每一个数字逆序组装回去,可以这样操作r=r*10+x%10。这样就可以倒序输出了。

注意:这里负数也是一样的操作方法,当取出每一个数字的时候,并且原数字是负数时,通过模的运算得到的每一位数字也是负数的。即-1234%10=-4。

题目做到这我们已经想到了基本的解决方案了,即把每一位数字拆出来再逆序拼回去,就可以得到满足题意的答案了。

但是值得注意的是我们的原数据超过界限时应该返回0。这里的做法就是使用长整形来存储我们的答案,如果最后得出来的数据超过了int的最大值或者小于int的最小值,那么我们就返回0。

代码

class Solution {
public:
    int reverse(int x) {
        long long res = 0;
        while(x)
        {
            res = res * 10 + x % 10;
            x /= 10;
        }

        if(res > INT_MAX || res < INT_MIN) return 0;
        return res;
    }
};

改进:通过循环将数字x的每一位拆开,在计算新值时每一步都判断是否溢出。 溢出条件有两个,一个是大于整数最大值MAX_VALUE,另一个是小于整数最小值MIN_VALUE

class Solution {
public:
    int reverse(int x) {
       int res = 0;
        while(x)
        {
           if(res > 0 && res > (INT_MAX - x %10) / 10) return 0;
            if(res < 0 && res < (INT_MIN - x %10) / 10) return 0;
            res = res * 10 + x % 10;
            x /= 10;
        }

       
        return res;
    }
};