题目:给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
描述:如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123 输出:321 示例 2:
输入:x = -123 输出:-321 示例 3:
输入:x = 120 输出:21 示例 4:
输入:x = 0 输出:0
提示:
-231 <= x <= 231 - 1
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/re… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解思路
使用取模获得末尾数字
以12345为例,先拿到5,再拿到4,之后是3,2,1,我们按这样的顺序就可以反向拼接处一个数字了,也就能达到 反转 的效果。
我们不能用long存储最终结果,而且有些数字可能是合法范围内的数字,但是反转过来就超过范围了。 假设有1147483649这个数字,它是小于最大的32位整数2147483647的,但是将这个数字反转过来后就变成了9463847411,这就比最大的32位整数还要大了,这样的数字是没法存到int里面的,所以肯定要返回0(溢出了)。
所以我们需要提前判断
如果某个数字大于 214748364那后面就不用再判断了,肯定溢出了。 如果某个数字等于 214748364呢,这对应到上图中第三、第四、第五排的数字,需要要跟最大数的末尾数字比较,如果这个数字比7还大,说明溢出了。
对于负数也是一样的
public class ReverseInt {
public int reverse(int x) {
int res = 0;
while(x != 0 ){
// 每次取末尾数字
int temp = x % 10;
// 判断是否大于最大 32 位整数
if (res > 214748364 || (res == 214748364 && temp > 7)) {
return 0;
}
// 判断是否小于 最小 32 位整数
if (res < -214738364 || (res == -214748364 && temp < -8)) {
return 0;
}
res = res * 10 + temp;
x /= 10;
}
return res;
}
}