第七題(簡單):整數反轉
題目:
給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。
示例 1:
輸入: 123
輸出: 321
示例 2:
輸入: -123
輸出: -321
示例 3:
輸入: 120
輸出: 21
注意:
假設我們的環境只能儲存得下 32 位的有符號整數,則其數值範圍為
[−231, 231 − 1]。請根據這個假設,如果反轉後整數溢位那麼就返回 0。
自己的程式碼:
public int reverse(int x) { long rev=0; while(x!= 0){ int pop = x%10; x/=10; rev = rev *10+pop; } if(rev>Integer.MAX_VALUE||rev<Integer.MIN_VALUE){ return 0; } return (int)rev; }
考慮了溢位,可以正確執行,可以正確提交
官方程式碼:
public int reverse1(int x) { int rev = 0;//儲存的是倒序 while (x != 0) { int pop = x % 10;//取模,得到的是最後一位數 x /= 10;//取出最後一個數後,除十,即抹去最後那位數 if (rev > Integer.MAX_VALUE / 10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0; if (rev < Integer.MIN_VALUE / 10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0; rev = rev * 10 + pop; } return rev; }
總結:
int 型別的大小 範圍是intMAX = 2147483647 , intMin = - 2147483648 。
需要注意溢位,一旦溢位就返回0
自己寫的程式碼是無腦判斷溢位,會加大時間複雜度。
即,會出現,當前計算值已經溢位的情況,再計算下去,還是溢位,無意義。
可以參考官方的程式碼
對於大於 intMax 的討論,此時 x 一定是正數,pop 也是正數。 如果 rev > intMax / 10 ,那麼沒的說,此時肯定溢位了。 如果 rev == intMax / 10 = 2147483647 / 10 = 214748364 ,此時 rev * 10 就 是 2147483640 如果 pop 大於 7 ,那麼就一定溢位了。但是!如果假設 pop 等於 8,那 麼意味著原數 x 是 8463847412 了,輸入的是 int ,而此時是溢位的狀態,所以不可能輸 入,所以意味著 pop 不可能大於 7 ,也就意味著 rev == intMax / 10 時不會造成溢位。 如果 rev < intMax / 10 ,意味著 rev 最大是 214748363 , rev * 10 就是 2147483630 , 此時再加上 pop ,一定不會溢位