20241106,LeetCode 每日一題,用 Go 實現整數迴文數判斷

小邓發表於2024-11-05

題目

給你一個整數 x​ ,如果 x​ 是一個迴文整數,返回 true​ ;否則,返回 false​ 。

迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。* 例如,121​ 是迴文,而 123​ 不是。

示例 1:

輸入:x = 121
輸出:true

示例 2:

輸入:x = -121
輸出:false
解釋:從左向右讀, 為 -121 。 從右向左讀, 為 121- 。因此它不是一個迴文數。

示例 3:

輸入:x = 10
輸出:false
解釋:從右向左讀, 為 01 。因此它不是一個迴文數。

提示:

  • -2^31 <= x <= 2^31 - 1

問題分析

  • 121 是迴文,因為從前往後和從後往前都一樣。
  • -121 不是迴文,因為負號不能出現在末尾。
  • 10 也不是迴文,因為從前往後是 "10",但從後往前是 "01"。

思路

透過反轉一半的數字來判斷是否迴文。

1、排除特殊情況: 一開始排除一些特殊數字,比如負數肯定不是迴文,另外如果一個不是0的整數的個位是0,它也不是迴文(因為開頭肯定不是0)。

2、逐步反轉: 從原始整數的最後一位(x%10​)開始提取,放到新的整數reversedHalf​的末尾(reversedHalf*10 + x%10​),然後把這個數字從原整數中剔除(x /= 10​)

3、停止條件: 當原始整數剩餘部分小於新的整數,說明已經反轉了一半數字了

4、判斷迴文: 如果是偶數個數,則兩個數相等;如果是奇數個數,則 x 就等於 reversedHalf/10​,忽略中間的數字。

複雜度

  • 時間複雜度: O(log n)
  • 空間複雜度: O(1)

程式碼實現


func isPalindrome(x int) bool {
    if x < 0 || (x%10 == 0 && x != 0) {
        return false
    }
    reversedHalf := 0
    for x > reversedHalf {
        reversedHalf = reversedHalf*10 + x%10
        x /= 10
    }
    return x == reversedHalf || x == reversedHalf/10
}

相關文章