leetcode的python實現 刷題筆記9:迴文數 暴力解法和進階演算法
阿新 • • 發佈:2018-11-25
判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。
示例 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