這是簡單難度的LeetCode習題,但總共用了兩個多小時的時間才搞定。其中出了很多問題,並且覺得很典型,所以寫博客以記錄下來。
對於輸入的函數,先判斷是否溢出,如果溢出直接返回0,否則進行如下操作:
取此數的絕對值
從最後一位開始,判斷當前位置是否爲0
從不爲0的第一個位置開始運算
獲取每一位的數字:
在運算的時候依次除以10,100……拋去餘數繼續進行,直到商小於1
public class Solution {
public int reverse(int x) {
double result=0,meresult=Math.abs(x),shang=1,beishu=10,yushu=0;
if(Math.abs(meresult)>((int)Math.pow(2,31)-1))
return 0;
boolean ifZero=true;
while(shang>0){
yushu=meresult%beishu;//求餘數
if(yushu!=0)
ifZero=false;
if(!ifZero){
if(Math.abs(result*10)>((int)Math.pow(2,31)-1))
return 0;
result=result*10+yushu;
}
meresult=(meresult-yushu)/beishu;
shang=meresult/beishu;//求商
}
if(x<0)
result=-result;
return (int)result;
}
}
思路也不難,但在真正實現的時候出了很多錯誤。
2.int和double的區別。int有32位,所以如果中間結果用int表示的話,一旦超出範圍就會出現亂的數字,所以都儘量改爲了用double。這個錯誤是一開始都沒有注意到的到最後才挑出來。這是很關鍵的一點,因爲如果要是直接把數據類型設置爲int,一旦在反轉過程中出現溢出問題,這個暫時的結果會變成很亂的一個數字,但絕對不是正確結果(這種情況其實只能在最後一步出現。另一種解決方案是在最後一步單獨處理,分別將結果放在int和double型對象中比較是否相等,如果不相等就返回0)。
meresult=(meresult-yushu)/beishu;
shang=meresult/beishu;//求商
補充一些知識點:
用 INT_MAX 常量可以替代這個值。
0x80000000是int的最小值:此數值是用補碼形式表示的