题目地址:整数反转
看到这个题目的第一反应就是是不是可以将整数转换成字符串,或者链表,之前做过反转链表的题,但考虑到可能效率低且可能会用到库函数。就想着取模和取余来解决:
class Solution{
public int reverse(int x){
int result = 0;
while(x!=0){
int temp = x%10;
result = result*10+temp;
x = x/10;
}
return result;
}
}
结果:
但在控制台发现123是可以反转的:
看评论区是溢出的问题,题目要求是32位有符号整数,因为它给的测试用例数字很大,
查了一下int的范围:最大的值与最小的值为:[−2^31, 2^31 − 1], 即:[-2147483648, 2147483647],
加了判断条件后:
class Solution{
public int reverse(int x){
int result = 0;
while(x!=0){
int temp = x%10;
if (result > Integer.MAX_VALUE / 10 || (result == Integer.MAX_VALUE / 10 && temp > 7))
return 0;
if (result < Integer.MIN_VALUE / 10 || (result == Integer.MIN_VALUE / 10 && temp < -8))
return 0;
result = result*10+temp;
x = x/10;
}
return result;
}
}
结果:
显示通过。
在评论区看到一个有意思的解法:
class Solution{
public int reverse(int x){
int result = 0;
while(x!=0){
int temp = x%10;
if ((result*10)/10!=result) {
result = 0;
break;
}
result = result*10+temp;
x = x/10;
}
return result;
}
}
结果:
相差不大。有个评论可以进行参考:
(ans * 10) / 10 其中的ans*10,java虚拟机内部实际上是进行了数值类型提升,即溢出时,用long类型数据暂时存储,最后通过变窄转换,保留低32位数值得到(ans * 10) / 10 != ans。因此是不能满足只存储32位整数的条件的。