方法一:官方给的,自己懂了后照着敲了一遍
class Solution {public int reverse(int x) {int rev = 0;while (x != 0) {//if判断条件过于复杂,我好不容易看懂了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;}
}
1.收获也有,
Java中整型最大值和最小值用两个变量表示:
2.在JDK中,整形类型是有范围的,最大值为Integer.MAX_VALUE,即2147483647,最小值为Integer.MIN_VALUE -2147483648。
对整形最大值加1,2147483648(越界了),那么此时值为多少呢?结果是-2147483648,即是Integer.MIN_VALUE。
类似的,对Integer.MIN_VALUE取反或者取绝对值呢?仍为Integer.MIN_VALUE,因为值为-2147483648,绝对值2147483648超过Integer.MAX_VALUE 2147483647。
所以就有以下结果
Integer.MAX_VALUE + 1 = Integer.MIN_VALUE
Math.abs(Integer.MIN_VALUE) = Integer.MIN_VALUE (绝对值)
Long,short,byte的结论是相同的。
转自:https://blog.csdn.net/qq_39590763/article/details/85764780
讲的太清楚了,希望原作者原谅我“直接参考”
方法二:力扣评论区网友的,比较好理解
class Solution {public int reverse(int x) {int rev = 0;int temp = 0;while(x!=0){temp = rev*10+x%10;if(temp/10!=rev){//溢出return 0;}rev = temp;x/=10;}return rev;}
}
1.if(temp/10!=rev)怎么就溢出了呢?
因为超过范围后部分数据会被抹去,这时在除以10也不能回到上一次循环,也就表示溢出了
2.这种方法比较野,不是“正派”解法,只适用于 溢出时编译器不报错 的语言,Java就是其一
再看看错误代码:
我第一次写的代码
class Solution {public int reverse(int x) {boolean flag = x>=0?false:true;//区分x正负if(flag){x=-x;}int rev = 0;while(x/10!=0){rev = rev*10+x%10;x /= 10;}rev = rev*10+x%10;if(flag){rev = -rev;}//判断rev是否在32位范围内if(rev>=Integer.MIN_VALUE&&rev<=Integer.MAX_VALUE){return rev;}else{return 0;}}
}
1.首先没分清求余和取模的概念,根本没必要用标志变量flag区分x的正负
2.没理解题目的要求:整数超过 32 位的有符号整数的范围就return 0;因为超过的数根本不会正确表示出来,所以代码
if(rev>=Integer.MIN_VALUE&&rev<=Integer.MAX_VALUE){return rev;}else{return 0;}
无用,我后来明白后想笑
3.可以优化while代码段
while(x!=0){rev = rev *10 + x%10;x/=10;
}
只是简单水平的题都能挖出这么多知识(我经常被菜醒)
生活充满希望!