给你一个 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
读题后的疑惑点:
- Java中的各个数据类型的范围分别是什么,针对这一题中特别研究整数类型的范围。
- 如何限制整数的范围为
-2^31 <= x <= 2^31 - 1
解答:
1.Java各数据类型的范围
针对该题是int的范围
我的题解思路:
首先判断给定的值是否在-2^31 <= x <= 2^31 - 1范围内,如果不在,则直接返回0,在的话则每次除10取余,将余数再乘以10加上下一位,直到原数变成0。
代码:
class Solution {
public int reverse(int x) {
if (x<Integer.MIN_VALUE || x>Integer.MAX_VALUE){
return 0;
}else{
int i = x;
int a=0;// 用来接收余数
int result = 0;
while (i!=0){
result = result*10 + a;
a = i%10;
i = i/10;
}
result = result*10 + a;
return result;
}
}
}
存在bug:
错误原因,在计算过程中发生了内存泄漏,也就是964632435*10超过了int类型的范围,而不存在检测逻辑导致出错。因此,在每次计算后判断时候正确的计算了,如果计算后的值-a/10不等于上一步的result,则说明内存泄漏,返回0。
修改后的题解:
class Solution {
public int reverse(int x) {
if (x<Integer.MIN_VALUE || x>Integer.MAX_VALUE){
return 0;
}else{
int i = x;
int a=0;// 用来接收余数
int result = 0,pre;
while (i!=0){
pre = result;
result = result*10 + a;
if ((result - a)/10!=pre) { // 通过还原上一步的值判断是否发生内存泄漏
return 0;
}
a = i%10;
i = i/10;
}
pre = result;
result = result*10 + a;
if ((result - a)/10!=pre) {
return 0;
}
return result;
}
}
}
官方题解:
class Solution {
public int reverse(int x) {
int rev = 0;
while (x != 0) {
if (rev < Integer.MIN_VALUE / 10 || rev > Integer.MAX_VALUE / 10) {
return 0;
}
int digit = x % 10;
x /= 10;
rev = rev * 10 + digit;
}
return rev;
}
}
作者:力扣官方题解
链接:https://leetcode.cn/problems/reverse-integer/solutions/755611/zheng-shu-fan-zhuan-by-leetcode-solution-bccn/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
其在判断数组内存泄漏时很聪明的使用了最大和最小的int数值/10与原值判断,这样就不需要再进行复原和存储上一次值的操作,同时它把计算的步骤放在了取余数之前。