大家好,這是一個不專業程式新手的 Leetcode 練習,算是我寫的第二個練習題XD
前言(廢話)
第一題寫了 Two Sum 的 Java 跟 JavaScript,覺得沒啥問題,本來想要按照上面的順序一題一題寫,但寫到第二題( Linklist )就果斷放棄繼續從 easy 開始,來看看Reverse Integer這題!
正文
題目說明:
- 給定一個 32 位元的整數,將此整數反過來,例如 x = 123,ans = 321。
- 反轉過來的數字不可以超過 int 的範圍,如果超過範圍,則回傳0。Java的int範圍 2147483647 ~ -2147483648 ( 2³¹-1 ~ -2³¹ )。
這邊我在寫的時候發現了一個問題,是我看完答案後恍然大悟的部分,那就是:雖然他給我們一個 int x 但是他的 x 卻有可能是超過 int 範圍的!(太誇張了吧~)
一開始題目會給的樣子:
class Solution {
public int reverse(int x) { }
}
我第一次寫完後長這樣:
class Solution {
public int reverse(int x) {
int y = 0;
while (x != 0){
int chr = x % 10;
x /= 10;
y = y * 10 + chr;
}
return y;
}
}
完全沒在跟你考慮別的啦XDD
大家應該看得出來在幹嘛吧~
設定 y 可能有些人會覺得不舒服 ,但他給的值是 x ,對應 y 應該不會太過分吧~chr 表示 character 。
- chr = x % 10 ,從後面開始一個一個的取出數字。
2. 取完數字後 x /= 10 把最後面的數字拿掉(已取出)。
3. y = y * 10 + chr 將取出的 chr 依序加到 y 上面。
以 x = 123來看,第一個 while 跑完:
chr = x % 10 = 3
x /= 10 = 12
y = y * 10 + chr = 0 + 3 = 3
接下來大家自行想像~
接著把應該有的條件加上去後(太長有點醜,附上截圖):
class Solution {
public int reverse(int x) {
int y = 0;
while (x != 0){
int chr = x % 10;
x /= 10;
if (y > Integer.MAX_VALUE/10 || (y == Integer.MAX_VALUE / 10 && chr > 7)) return 0;
if (y < Integer.MIN_VALUE/10 || (y == Integer.MIN_VALUE / 10 && chr < -8)) return 0;
y = y * 10 + chr;
}
return y;
}
}
第7、8行就是我們加上去的判斷, Integer.MAX_VALUE 跟 Integer.MIN_VALUE 是 Java 本身就有的,表示 Java 中 int 能儲存的最大及最小數值。
那 Integer.MAX_VALUE 跟 Integer.MAX_VALUE ,為何要/10呢?記得我們一開始宣告了 int y 嗎?既然 y 這個東西被宣告成為了 int 那這個數字就不可能會 > Integer.MAX_VALUE 或 < Integer.MIN_VALUE 了,所以我們就先比到Integer.MAX_VALUE / 10 的位數。
如果 Integer.MAX_VALUE / 10 就已經超出範圍了,那這個值就一定會 > Integer.MAX_VALUE 或 < Integer.MIN_VALUE ,就直接進入 if 並return 0 ; 如果剛好 = Integer.MAX_VALUE 或 = Integer.MIN_VALUE ,就必須進行最後一個數字的比較。
以 MAX_VALUE 舉例:int 最大值 2147483647 ,前面的數字214…4都一樣,若最後一個數 > 7 ,那這樣就是超過了 ;而 int 的最小值為 -2147483648 ,那麼最後一個數 > -8 ,if 也會成立並回傳 0。
總結
以上說了這麼多都是在解釋中間 if 的部分,其他都還蠻好理解的,只是有些人可能會跟我一樣中間突然卡住想不通,所以寫寫這篇心得跟大家分享一下,希望可以讓某某人在某某時間得到小小的幫助><
如果跟我一樣是新手的,希望我們在這條道路上都能持續努力進步~掰
新發現!
我把程式轉成 JavaScript 後,發現其實前面就能先判斷 x 是否已超出了 int 範圍,這樣後面就不用很辛苦地進行前面那些 if 判斷了(嗚嗚把我努力解釋的時間還來~)
雖然時間上都是 1ms ,但是在 JavaScript 的表現上差異蠻大的(下面附圖),所以 Java 上的表現應該是有些微的差異吧??(我是這麼想的啦XD
好,再跟各位掰一下,掰~