7. 整数反转
题目描述
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
注意:
- 假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [ − 2 31 , 2 31 − 1 ] [−2^{31}, 2^{31} − 1] [−231,231−1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
示例1
输入:x = 123
输出:321
示例2
输入:x = -123
输出:-321
示例3
输入:x = 120
输出:21
示例4
输入:x = 0
输出:0
提示:
- − 2 31 ≤ x ≤ 2 31 − 1 -2^{31} \le x \le 2^{31} - 1 −231≤x≤231−1
题解:
法一:
使用 long long 类型中间变量保存数字的逆序结果,然后和 INT_MIN 和 INT_MAX 比较大小即可。
在 C++ 中,负数对正数取模后的结果仍是负数,比如 − 128 % 10 = − 8 -128 \% 10=-8 −128%10=−8 ,于是我们可以不用处理负数了。
法一代码:
class Solution {
public:
int reverse(int x) {
long ret = 0;
while ( x ) {
ret = ret * 10 + x % 10;
x /= 10;
}
if ( ret < INT_MIN || ret > INT_MAX ) ret = 0;
return ret;
}
};
/*
时间:0ms,击败:100.00%
内存:6.2MB,击败:54.12%
*/
法二:
按照题意,不使用 long long 类型中间变量,可以使用数学方法解决:
- 若是正数溢出,肯定是 r ∗ 10 + x % 10 > I N T _ M A X r*10 + x \% 10 > INT\_MAX r∗10+x%10>INT_MAX,化简一下可得: r > ( I N T _ M A X − x % 10 ) / 10 r > (INT\_MAX - x \% 10) / 10 r>(INT_MAX−x%10)/10
- 若是负数溢出,肯定是 r ∗ 10 + x % 10 < I N T _ M I N r*10 + x \% 10 < INT\_MIN r∗10+x%10<INT_MIN,化简一下可得: r < ( I N T _ M I N − x % 10 ) / 10 r < (INT\_MIN - x \% 10) / 10 r<(INT_MIN−x%10)/10
法二代码:
class Solution {
public:
int reverse(int x) {
int ret = 0, t;
while ( x ) {
t = x % 10;
if ( x > 0 && ret > (INT_MAX - t) / 10 ) return 0;
if ( x < 0 && ret < (INT_MIN - t) / 10 ) return 0;
ret = ret * 10 + t;
x /= 10;
}
return ret;
}
};
/*
时间:4ms,击败:52.99%
内存:6MB,击败:85.01%
*/