题目描述
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
样例
输入:x = 123
输出:321
算法1
(枚举) $O(log n)$
秦九韶算法:res = res * 10 + x % 10(将数字反转)
判断溢出:两种情况
1. res > 0时,res + x % 10 > INT_MAX
也就即res > (INT_MAX - x % 10) / 10
2. res < 0时,res + x % 10 < INT_MIN
也就即res < (INT_MIN - x % 10) / 10
在此过程中res不会越界,因为每一次都乘上10,如果符合上述结果的话早就return 0了
C++ 代码
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;
}
};
算法2
使用long long的话
C++ 代码
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;
}
};