7.反转整数

给定一个 32 位有符号整数,将整数中的数字进行反转。

示例 1:

输入: 123
输出: 321

示例 2:

输入: -123
输出: -321

示例 3:

输入: 120
输出: 21

注意:
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−2^31, 2^31 − 1]。根据这个假设,如果反转后的整数溢出,则返回 0。

这道题我的思路是,先全部统一为正数,然后每次模10取余数,res*10+余数,实现反转

实现过程中出现的第一个问题是res * 10,由于res是int型,当超过int型范围时,存储异常。因此修改为(long long)res * 10
进行强制类型转换,这样就不会溢出了

出现的第二个问题,是我统一为正数的时候,负数直接*-1,观察到负数的范围实际上是可以取到-2^31的,当乘-1后,会超过int边界,无法正常做乘法运算。
思考了一下,不作统一转换了,只是在res计算的时候,余数x%10的值,当x为负数时,余数额外乘-1,如此得到的就均为正数结果了

从参考答案中了解到,原来C++中有自带的INT_MAX和INT_MIN

具体代码:

#include
#include
#include
#include
#include

using namespace std;

int reverse(int x){
    int sym = 0;
    long long int_max = 2147483647;
    int res = 0;
    if(x < 0){
        sym = 1;
    }
    while(x){
        if(int_max + sym - (x % 10) < (long long)res * 10){
            return 0;
        }
        res *= 10;
        res += sym ? (-1 * (x % 10)) :x % 10;
        x /= 10;
    }
    if(sym){
        res *= -1;
    }
    return res;
}

int main(){
    cout << reverse(-647) << endl;
    return 0;
}

你可能感兴趣的:(7.反转整数)