方法一:官方給的,自己懂了后照著敲了一遍
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;
}
只是簡單水平的題都能挖出這么多知識(我經常被菜醒)
生活充滿希望!