讓我們一起啃演算法----迴文數

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

迴文數(Palindrome-Number)

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

判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。
示例 1:
  輸入: 121
  輸出: true
示例 2:
  輸入: -121
  輸出: false
解釋: 從左向右讀, 為 -121 。 從右向左讀, 為 121- 。因此它不是一個迴文數。
示例 3:
  輸入: 10
  輸出: false
解釋: 從右向左讀, 為 01 。因此它不是一個迴文數。

解題思路

按照題目的定義: 負數一定不是迴文數,並且 [0,9] 的數一定是迴文數

其次,我們稍微延伸一下題目,如果判斷一個字串是否是迴文字串,我們會怎麼做?常規思路就是設定兩個指標 ij 分別指向字串的第一個字元和最後一個字元,然後 指標 i 向後挪指標 j 向前挪,每挪動一次就比較 指標 i 指向的字元是否和指標 j 指向的字元相等。具體流程如下:

如上,那我們是不是可以沿用判斷字串是否是迴文字串的思路來判斷數字呢?當然是可以的啦。

所以現在的問題變成了怎麼拿到數字的第一位和最後一位?上一篇文章 讓我們一起啃演算法—-整數反轉 我們知道了 一個數與10取模可以得到最後一位的值。那第一位的值如何得到呢?可以用如下方式:

假設目標數字是 3245,它是一個四位數,最小的四位數是1000,3245 / 1000 就可以拿到第一位的值即 3 。

拿到了第一位的值和最後的一位的值之後,我們只需要判斷是否相等即可。

具體的程式碼實現

GO語言實現:

func isPalindrome(x int) bool {
    if x < 0 {
        return false
    }
    div := 1
    // 得到相應位數的最小值
    // 例如:3245,那麼div的值就是1000
    for x / (div) >=  10 {
        div *= 10
    }
    for x != 0 {
        // 得到第一位的值
        left := x / div
        // 得到最後一位的值
        right := x % 10
        if left != right {
            return false
        }
        // 去掉第一位和最後一位
        // 例如:( 3245 - 3 * 1000 )/ 10 = 24
        x = (x - left * div) / 10

        // 因為去掉了兩位,因此div也相應的調整
        div /= 100
    }
    return true
}

總結

每天進步一點點,加油!
完整程式碼:https://github.com/wx-satellite/go-leetcod…( 如果對你有幫助,記得點個 star 喲 )

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

三斤

相關文章