1. 程式人生 > >5.迴文數-leetcode 009(python)

5.迴文數-leetcode 009(python)

  • 題目描述

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

  • 示例1

輸入: 121 輸出: true

  • 示例2

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

  • 示例3

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

  • 解決方案一

受題目啟發,將整數轉換為字串,判斷正序與倒序字串是否相等

  • 程式碼一
class Solution(object):
    def isPalindrome(self, x):
        """
        :type x: int
        :rtype: bool
        """
        flag = False
        str_1 = str(x)
        str_2 = str_1[::-1]
        if str_1 == str_2:
            flag = True
        return flag
  • 解決方案二

首先排除x是負數的情況,肯定不是迴文數,然後依次比較x的最高位數字和最低位數字,需要藉助一個記錄當前數字x共有多少位的變數d,在比較的迴圈中,x需要不斷去掉最高位和最低位,因此每進行一次迴圈,d就需要除以100

需要注意的是,while迴圈的條件是x>0,而不是x>=10,我第一次出錯就是因為沒想清楚這個道理。執行報錯了才知道。如果輸入是1000021的話,那麼一次迴圈之後,x變為00002,仍舊需要在迴圈中進行比較,而如果按照x>=10的條件來執行,就會直接返回true的結果,出現錯誤。

  • 程式碼二
class Solution(object):
    def isPalindrome(self, x):
        """
        :type x: int
        :rtype: bool
        """
        
        flag = True
        
        #如果x是負數的話,肯定不是迴文數
        if x < 0:
            flag = False
            return flag
        #計算x共有多少位
        d = 1
        while x/d >= 10:
            d = d * 10
            
        #迴圈取x的最高位和最低位,每次比較
        #即使x是個位數,也需要在迴圈中比較,可能出現x=00002的情況
        while x > 0:
            #q是x的最高位
            q = x/d
            #r是x的最低位
            r = x%10
            if q != r:
                flag = False
                return flag
            #去掉x的最高位和最低位
            x = x%d/10
            d = d / 100
            
        return flag