iT邦幫忙

DAY 9
2

連續30天,挑戰演算法系列 第 9

[Day09] 30 天挑戰演算法 - 將數字反轉

題目來源: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 數字反轉解答 (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

上一篇
[Day08] 30 天挑戰演算法 - 判斷二元搜尋樹
下一篇
[Day10] 30 天挑戰演算法 - 兩個 LinkedList 之和
系列文
連續30天,挑戰演算法30

尚未有邦友留言

立即登入留言