Given a 32-bit signed integer, reverse digits of an integer.
Example 1:
Input: 123 Output: 321
Example 2:
Input: -123 Output: -321
Example 3:
Input: 120 Output: 21
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−,
− 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.
Solution
Pop and Push Digits & Check before Overflow
Intuition
We can build up the reverse integer one digit at a time. While doing so, we can check beforehand whether or not appending another digit would cause overflow.
Algorithm
Reversing an integer can be done similarly to reversing a string.
We want to repeatedly "pop" the last digit off of xx and "push" it to the back of the \text{rev}rev. In the end, \text{rev}rev will be the reverse of the xx.
To "pop" and "push" digits without the help of some auxiliary stack/array, we can use math.
//pop operation:
pop = x % 10;
x /= 10;
//push operation:
temp = rev * 10 + pop;
rev = temp;
However, this approach is dangerous, because the statement temp=rev⋅10+pop can cause overflow.
Luckily, it is easy to check beforehand whether or this statement would cause an overflow.
To explain, lets assume that rev is positive.
Similar logic can be applied when rev is negative.
class Solution {
public:
int reverse(int x) {
int rev = 0;
while (x != 0) {
int pop = x % 10;
x /= 10;
if (rev > INT_MAX/10 || (rev == INT_MAX/10 && pop > 7)) return 0;
if (rev < INT_MIN/10 || (rev == INT_MIN/10 && pop < -8)) return 0;
rev = rev * 10 + pop;
}
return rev;
}
};
在这里需要注意的是题目中说假设环境只能够存储32位有符号的整数,所以有一些解法利用c++ 的long或者long long来解决问题是不合理的,还有就是c++和python的负数取余的结果是不一样的,比如说对于-9%10在c++的结果为-9,在python的结果为1。四个字节的有符号整数的取值范围为-2,147,483,648~2,147,483,647,检查溢出的时候要注意这一点。