题目来源
题目描述
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1
输入:x = 123
输出:321
示例 2
输入:x = -123
输出:-321
示例 3
输入:x = 120
输出:21
示例 4
输入:x = 0
输出:0
提示
- -2^31 <= x <= 2^31 - 1
题目解析
本题还是比较简单的,主要就是考察整数分解。
假设有整数 x,现在我们需要求解它各位上的数,那么我们只要不断进行如下两个操作即可:
- x % 10,求余10,那么余数就是最低位的数
- x = x / 10,整除10,那么商就是去掉最低位后的数
反复进行上面两步,即可将一个整数分解。
本题需要我们将整数反转,即低位变高位,其实也很简单,假设初始化 res = 0,那么:
- res = res * 10 + x %10
按此逻辑,先分解出来的低位不停地 *10 提高位序,即可完成整数反转。
需要注意的是,本题的 x 虽然取值范围限制在了 int 范围内,但是 x 反转后的数值是可能超出 int 范围的,但是不会超出 long 范围,因此反转后的数 res 我们应该使用 long 来记录。
还有一点,本题暴露了python的一个问题,那就是 python 的 负数取余正数 比较奇葩,会产生意想不到的结果,python 同学需要注意一下,看下下面代码实现。
还有一点,写这题时,我们可能不会记得 int 范围最大值和最小值,因此可能会利用 pow 函数或者 << 运算去求解。
比如我们表示 2^31 - 1,可能会使用 pow(2, 31) - 1,或者 (1 << 31) - 1
但是需要注意的是:(1 << 31) 的结果居然是负数????这个大家自己去网上搜搜资料看看。因此更推荐使用 pow 方式,当然,你能记得具体 int 最大最小值更好。
C源码实现
cpp
int reverse(int x){
long res = 0;
while(x != 0) {
res = res * 10 + x % 10;
if(res >= INT_MAX || res <= INT_MIN) {
return 0;
}
x /= 10;
}
return res;
}
C++源码实现
cpp
class Solution {
public:
int reverse(int x) {
long res = 0;
while(x != 0) {
res = res * 10 + x % 10;
if(res >= INT_MAX || res <= INT_MIN) {
return 0;
}
x /= 10;
}
return (int) res;
}
};
Java源码实现
java
class Solution {
public int reverse(int x) {
long res = 0;
while (x != 0) {
res = res * 10 + x % 10;
if(res >= Integer.MAX_VALUE || res <= Integer.MIN_VALUE) {
return 0;
}
x /= 10;
}
return (int) res;
}
}
Python源码实现
python
class Solution(object):
def reverse(self, x):
"""
:type x: int
:rtype: int
"""
res = 0
sign = -1 if x < 0 else 1
int_max = pow(2, 31) - 1
int_min = -pow(2, 31)
while x != 0:
res = res * 10 + abs(x) % 10 * sign
if res >= int_max or res <= int_min:
return 0
x = abs(x) / 10 * sign
return res
JavaScript源码实现
javascript
/**
* @param {number} x
* @return {number}
*/
var reverse = function (x) {
let res = 0;
const INT_MAX = Math.pow(2, 31) - 1;
const INT_MIN = -Math.pow(2, 31);
while (x != 0) {
res = res * 10 + (x % 10);
if (res >= INT_MAX || res <= INT_MIN) {
return 0;
}
x = parseInt(x / 10);
}
return res;
};