1. 程式人生 > >leetcode的python實現 刷題筆記9:迴文數 暴力解法和進階演算法

leetcode的python實現 刷題筆記9:迴文數 暴力解法和進階演算法

判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。

示例 1:

輸入: 121
輸出: true

示例 2:

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

示例 3:

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

進階:

你能不將整數轉為字串來解決這個問題嗎?

簡單的做法只需要將int型別的數字變成字串型別,然後翻轉,比較兩者是否相等,如果相等,就返回True.

class Solution(object):
    def isPalindrome(self, x):
        string = str(x)
        string1 = string[::-1]
        if string == string1:
            return True
        else:
            return False

進階的做法,在網上看了很多的解法,發現很多人的程式碼只是滿足三位數的數字,當不是三位數的時候,就開始報錯,比如以下的程式。當執行的數字變成123321,22,這樣的數字時就出現了錯誤。

 def isPalindrome(self, x):
        """
        :type x: int
        :rtype: bool
        """
        # 如果x是負數或者x是10的倍數,都要返回為0
        if x < 0 or (x != 0 and x % 10 == 0):
            return False
        half = 0
        # 迴圈找到每個位置上的數字
        while x > half:
            half = half * 10 + x % 10
            x /= 10
        return x == half or half / 10 == x

於是乎,就重新想了下這個問題,寫了以下的程式碼

    def isPalindrome(self, x):
        """
        :type x: int
        :rtype: bool
        """
        # 如果x是負數,或者0,或者最後一位是0,都返回false
        if x < 0 or (x % 10 == 0 and x != 0):
            return False
        temp = x
        s = 0
        # 當不等於0時,執行以下迴圈
        while temp != 0:
            # 不斷地重複此迴圈,然後從尾到頭來一個個擴大,恢復成原來的數
            s = s * 10 + (temp % 10)
            temp = temp // 10
        # 跳出迴圈之後,將得到的與比較,如果相等就返回true,否則false
        return s == x

演算法實現過程是這樣的:

首先將得到的數字做一個判斷,如果這個數字不是負數,並且這個非零的數字不是十的倍數,就執行接下來的判斷。否則就輸出false了。

在這裡我們舉個例子吧,12321。

在執行while迴圈的時候,不斷地從後往前丟擲數字,1,2,3,2,1.然後在while迴圈裡,不斷地重複擴大賦值給s。

第1圈迴圈,s = 1,temp = 1232

第2圈迴圈,s = 12,temp = 123

第3圈迴圈,s = 123,temp = 12

第4圈迴圈,s = 1232,temp = 1

第5圈迴圈,s = 12321,temp = 0

然後就跳出迴圈了。

接下來就是判斷s 和 x是否相等了。在python中 == 表示的意思是疑問句,=表示的是陳述句。

s == x也就是問這兩個數字是否相等?是就返回true,否則返回false