Reverse Integer


這是簡單難度的LeetCode習題,但總共用了兩個多小時的時間才搞定。其中出了很多問題,並且覺得很典型,所以寫博客以記錄下來。

最終結果:



先說一下解題思路。這道題的關鍵就是考慮各種臨界情況(特殊情況):


對於輸入的函數,先判斷是否溢出,如果溢出直接返回0,否則進行如下操作:


取此數的絕對值


從最後一位開始,判斷當前位置是否爲0


從不爲0的第一個位置開始運算


獲取每一位的數字:


在運算的時候依次除以10,100……拋去餘數繼續進行,直到商小於1
(或者除以10,在做完除法之後將原來的數縮小十倍)

以下爲代碼:
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;
		}
}

思路也不難,但在真正實現的時候出了很多錯誤。

1.不注意有符號整數和無符號整數的區別,後改爲用絕對值比較大小。

2.int和double的區別。int有32位,所以如果中間結果用int表示的話,一旦超出範圍就會出現亂的數字,所以都儘量改爲了用double。這個錯誤是一開始都沒有注意到的到最後才挑出來。這是很關鍵的一點,因爲如果要是直接把數據類型設置爲int,一旦在反轉過程中出現溢出問題,這個暫時的結果會變成很亂的一個數字,但絕對不是正確結果(這種情況其實只能在最後一步出現。另一種解決方案是在最後一步單獨處理,分別將結果放在int和double型對象中比較是否相等,如果不相等就返回0)。

3.代碼執行順序。
meresult=(meresult-yushu)/beishu;

shang=meresult/beishu;//求商
這兩句代碼如果相反順序執行會發生錯誤

最後還是感覺自己實現的優點囉嗦,可讀性不是很高,但大體思路是沒有問題的。



補充一些知識點:

0x7FFFFFFF是long int的最大值:以8位進制計數,相當於二進制中的0111 1111 1111 1111 1111 1111 1111 1111

      用 INT_MAX 常量可以替代這個值。


0x80000000是int的最小值:此數值是用補碼形式表示的



1.不注意有符號整數和無
發佈了36 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章