題目來源:Reverse Integer
問題:
給一個數字,將其反轉
例子:
例如: x = 123, 則回傳 321
例如: x = -123, 則回傳 -321
想法:
這題目作法我想到有兩種:
第一種作法就是使用 字串反轉 方式。但是,使用字串反轉會遇到一個 正/負 號的問題。假設數字是負數的,這個反轉後的負號就會跑到最後面(例如:-123 會變成 321-)。因此我們必須把正負號先取出來,取出之後再將 數字轉成字串(string) 進行反轉,最後再將正負號放回去。
第二個作法也是先把 正/負 號取出,再用 mod 10(除以 10 取餘數) 及 乘法 把數字作反轉。相較於第一種作法,這種方式就不用進行 數字 -> 文字 -> (處理文字反轉) -> 數字 的步驟。不過因為題目沒有限制這數字對多有幾位數,所以我是採用 無限回圈 + 一個 終止條件 來進行反轉。
例如:輸入數字為 5678, 則我每做一次 mod 10, 我就可以得到最後一位數,每做一次 除以 10 輸入的數字就會少一位數。因此我可這樣做:
先把 result 設成 0
5678 mod 10 -> 得到 8
5678 / 10 -> 得到 567
把 result * 10 + 8 得到 8 設給 result( 0*10+8 這時 result = 8)
(反覆上面的步驟直到 輸入的數字為 0 )
567 mod 10 得到 7
567 / 10 得到 56
把 result * 10 + 7 設給 result ( 8*10+7 = 87 )
(反覆上面的步驟直到 輸入的數字為 0 )
56 mod 10 得到 6
56 / 10 得到 5
把 result * 10 + 6 設給 result ( 87*10+6 =876)
.....到這裡發現規則了嗎? 如果還沒發現,下面的虛擬碼應該會讓你恍然大悟
虛擬碼
//數字操作
取出正負號先將其保留
宣高一個回傳結果 result 並設成 0
宣告一個暫存變數 tmp 並將 要反轉的數字設給他
無限迴圈 {
將 temp mod 10 得到的值設給 digit // 此一步驟目的在取得個位數
將 result * 10 + digit 設給 result // 此一步驟是再將結果的右邊家個個位數
將 temp / 10 並設給 temp // 此一步驟目的在消除個位數
若 temp 為 0 {
終止回圈並跳出
}
}
將 正/負 號放回 result
回傳 result
//字串操作
取出正負號先將其保留
將輸入的數字轉成字串
將字串反轉
將反轉的字串轉回數字
將正負號放回數字中
回傳結果
如果你用 Java or Python or C++ 可上 [[LeetCode Online Judge](https://oj.leetcode.com/problems/reverse-integer/" style="font-size: 13px; line-height: 1.6;)][Problem] 驗證
還是想不出來嗎?參考我的答案吧!
java 數字反轉解答 (Java)
public int reverse(int x) {
boolean isNegativeInt = x < 0;
if (isNegativeInt)
x *= -1;
int result = 0;
int tmp = x;
while (true) {
int digit = tmp%10;
result = result * 10 + digit;
tmp /=10;
if (tmp == 0)
break;
}
if (isNegativeInt)
result *= -1;
return result;
}
python 數字反轉(Python)
def reverse(self, x):
isNegative = x < 0
if isNegative
x = x * -1
xStr = str(x)
xStr = xStr[::-1]
x = int(xStr)
if isNegative:
x *= -1
return x