7. Reverse Integer
【题目】
Given a 32-bit signed integer, reverse digits of an integer.
給定一個 32 位有符號整數,將整數中的數字進行反轉。
Example 1:
Input:
123
Output:
321
Example 2:
Input:
-123
Output:
-321
【思路】
很簡單很簡單的題目,反轉數字,
但在解題前先釐清下列幾點就可以解決:
1:10 and -10 ,確認反轉答案為 1 及 -1 即可在前面先判斷減少時間
2:負數的問題,程式語言的不同可能會造成問題,所以負數也要考慮,如果不確定前面先轉正就不會有問題了
3:32 Bit 整數溢出的問題,最大值為 2,147,483,647;也就是十六進位 0x7FFFFFFF,這邊要注意程式語言的不同也會有問題,
像是JAVA值會溢出變奇怪,Python不會,這樣就變成兩邊判斷方式有差異辣。
【解法】
☆JAVA
class Solution {
public static int reverse(int x) {
int result = 0;
if(x == 10){return 1;}
while(x!=0){
int tail = x % 10; //假設 輸入值是 123 第一次 tail = 3 , 第二次 tail = 2 , 第三次 tail = 1
int newResult = result * 10 + tail; //假設 輸入值是 123 newResult 第一次為 0*10+3 = 3 , 第二次為 3*10+2 = 32 , 第三次為 32*10+1 = 321
if((newResult-tail)/10 != result ){return 0;} //判斷溢出,檢核計算後值是否相同,因為Java如果值溢出會壞掉 Ex:964632435*10 會變成 1056389758
result = newResult; // 0 > 3 > 32 > 321
x = x / 10;
}
return result;
}
}
☆Python
Tips: Python中如果用 / 去除 會有小數點 , 用 // 則會整除
1534 / 10 # 153.4
1534 // 10 # 153
1534 % 10 # 4
Tips: 正負數的取餘數,頭痛的來了,Python算餘數的方式跟別人不一樣 (自己整理出來的 如果有錯請糾正 )
一般程序是用: Truncated Division
可是Python用: Floored Division
看下列範例比較好懂,如果要更詳細的說明可以看下方連結,這邊就不探討了。
(-17) mod 5
答案一: (-17) = (-3)*5 + (-2),所以餘數是 -2 。 # Truncated Division
答案二: (-17) = (-4)*5 + (+3),所以餘數是 +3 。 # Floored Division
Reference:
#詳細說明
https://goo.gl/A2FjN8
https://goo.gl/LqBwES
#範例
https://goo.gl/fSGgoG
class Solution:
def reverse(x):
nFlag = False; #負數判斷
result = 0;
if(x<0):
nFlag = True;
x = abs(x); #轉正數
if(x == 10): return -1 if nFlag else 1 ;
while(x != 0):
newResult = ( result * 10 ) + ( x % 10);
xxx = (newResult - (x % 10) ) // 10;
result = newResult;
x = x // 10;
if (result >= 0x7fffffff): return 0; # 判斷溢出 如果輸出值大於溢出值 則 Return 0
return -result if nFlag else result ; # 每個Return都有做負數判斷
但下列我在LeetCode裡面看到比較厲害的解法,可以參考看看
像他這樣是用陣列的概念去實現反轉,也就是說假設輸入值是 54321,
他先轉陣列 變成 [5,4,3,2,1] ,然後反轉從後面開始 [::-1] 並輸出 ,就會回傳 12345 了
處理負數的地方也很漂亮,判斷為負數後先轉正並執行上述動作後再轉負數 * -1 即可
最後在統一判斷回傳值是否大於 溢出值 即可。
class Solution:
def reverse(self, x):
if x < 0:
y = -1 * int(str(-x)[::-1])
else:
y = int(str(x)[::-1])
if y > 2**31 or y < -2**31:
y = 0
return y
複習一下陣列玩法
li = [1, 2, 4, 3];
0 1 2 3
li[1:3] # => [2, 4] 取第一個到第三個(最後一個不取)
li[2:] # => [4, 3] 取第二個之後的數字(含第二個)
li[:3] # => [1, 2, 4] 取到第三個之前的(不含第三個)
li[::2] # =>[1, 4] 每兩個取一個 , [:3] 就輸出成 1,3
li[::-1] # => [3, 4, 2, 1] 倒轉