讓我們一起啃演算法----整數反轉

三斤和他的喵發表於2020-04-10

整數反轉(Reverse-Integer)

這是一個比較簡單的題目,題幹如下:

給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。
示例 1:
  輸入: 123
  輸出: 321
示例 2:
  輸入: -123
  輸出: -321
示例 3:
  輸入: 120
  輸出: 21
注意:
假設我們的環境只能儲存得下 32 位的有符號整數,則其數值範圍為 [−231, 231 − 1]。請根據這個假設,如果反轉後整數溢位那麼就返回 0。

我覺得這個題目的考點在於讓你有個意識:數字型別是有可能溢位的。

解題思路

這個題整體的思路就是:與10取模,再與10相除取整,往復迴圈直至目標值為0,流程圖如下:

其中需要注意點有兩個:

  • 負數和正數其實不用分類討論,例如 -12310 取模得到的值是 -3,與正數的處理邏輯是一致。
  • 溢位的判斷,我這裡採用了一個 倒推思路 :例如 C = A + B,那麼如果沒有溢位 可以得到 A = C - B,但是溢位了就 得到 A != C - B

具體的程式碼實現

GO語言實現:(建議配合上面的解題思路看程式碼)

func reverse(x int) int {
    var (
        result = 0
    )
    // x為正負數不用分類討論。
    // 因為:-123 % 10 = -3,與正數的處理邏輯一致
    for x != 0 {
        mod := x % 10
        newResult := result*10 + mod
        // 倒推思路: C = A + B,如果沒有溢位 A = C - B,溢位之後 A != C - B
        if (newResult-mod)/10 != result {
            return 0
        }

        result = newResult

        // 去掉最後一位
        x = x / 10

    }
    return result
}

總結

每天進步一點點,加油!
完整程式碼:https://github.com/wx-satellite/go-leetcod…
順手點個 star

本作品採用《CC 協議》,轉載必須註明作者和本文連結

三斤

相關文章