7. Reverse Integer
Given a signed 32-bit integer x
, return x
with its digits reversed. If reversing x
causes the value to go outside the signed 32-bit integer range [-231, 231 - 1]
, then return 0
.
Assume the environment does not allow you to store 64-bit integers (signed or unsigned).
Example 1:
Input: x = 123
Output: 321
Example 2:
Input: x = -123
Output: -321
Example 3:
Input: x = 120
Output: 21
Example 4:
Input: x = 0
Output: 0
Constraints:
-231 <= x <= 231 - 1
解法: 此题的意思就是将给定的一个数进行反转,如果存在溢出情况就返回0。
将数字进行反转并不难,可以除10取余数进行操作,此问题的关键就是要判断溢出时的情况。
因为输入的数字是int型,所以它的范围就是[INT_MIN,INT_MAX],即-2147483648~2147483647 之间。
那么res最大的情况就是214748364,因为x是一个整数,在可能溢出的情况下其开始的第一位是1或者2,
所以 res 只能是 2147483641 或 2147483642 都在 int 的范围内,但是它们对应的x为 1463847412 和 2463847412,
后者超出了数值范围。所以当过程中 res 等于 214748364 时, 输入的x只能为 1463847412, 翻转后的结果为 2147483641,都在正确的范围内。
class Solution {
public:
int reverse(int x) {
int res = 0;
while (x != 0) {
if (abs(res) > INT_MAX / 10) return 0;
res = res * 10 + x % 10;
x /= 10;
}
return res;
}
};
还有另一种方法就是直接判断溢出是与INT_MAX或者INT_MIN进行比较,详细的解释可以查看leetcode
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;
}
};