LeetCode題解-迴文數的五種Python解法

一、題目描述

題目:9.迴文數
難度:簡單

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

示例 1:

輸入: 121
輸出: true

示例 2:

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

示例 3:

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

進階:

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

二、題目解析

1. 解題思路

五種解法
解題思路: (五種實現方法)

  1. 轉成字符串:
    a. 雙向隊列
    b. 雙指針
  2. 不轉字符串:
    a. 模擬字符串的雙向隊列(使用math庫的log函數 獲取整數的位數)
    b. 反轉後面一半的整數(使用math庫的log函數 獲取整數的位數)
    c. 反轉後面一半的整數(不適用log函數) (通過原整數x 與 reverse_x 的大小判斷)

2. Python實現

class Solution:

    # 方法一: 將int轉化成str類型: 雙向隊列
    # 複雜度: O(n^2) [每次pop(0)都是O(n)..比較費時]
    def isPalindrome(x: int) -> bool:
        lst = list(str(x))
        while len(lst) > 1:
            if lst.pop(0) != lst.pop():
                return  False
        return True


    # 方法二: 將int轉化成str類型: 雙指針 (指針的性能一直都挺高的)
    # 複雜度: O(n)
    def isPalindrome(x: int) -> bool:
        lst = list(str(x))
        L, R = 0, len(lst)-1
        while L <= R:
            if lst[L] != lst[R]:
                return  False
            L += 1
            R -= 1
        return True


    # 方法三: 進階:不將整數轉爲字符串來解決: 使用log來計算x的位數
    # 複雜度: O(n)
    def isPalindrome(self, x: int) -> bool:
        """
        模仿上面字符串的方法:分別取'第一位的數'與'第二位的數'對比
                        (弊端是:頻繁計算,導致速度變慢)(下面的方法三隻反轉一半數字,可以提高性能)
        """
        if x < 0:
            return False
        elif x == 0:
            return True
        else:
            import math
            length = int(math.log(x, 10)) + 1
            L = length-1
            print("l = ", L)
            for i in range(length//2):
                if x // 10**L != x % 10:
                    return False
                x = (x % 10**L) //10
                L -= 2
            return True

    # 方法四: 進階:不將整數轉爲字符串來解決: 使用log來計算x的位數
    # 複雜度: O(n)
    def isPalindrome(self, x: int) -> bool:
        """
        只反轉後面一半的數字!!(節省一半的時間)
        """
        if x < 0 or (x!=0 and x%10==0):
            return False
        elif x == 0:
            return True
        else:
            import math
            length = int(math.log(x, 10)) + 1
            reverse_x = 0
            for i in range(length//2):
                remainder = x % 10
                x = x // 10
                reverse_x = reverse_x * 10 + remainder
            # 當x爲奇數時, 只要滿足 reverse_x == x//10 即可
            if reverse_x == x or reverse_x == x//10:
                return True
            else:
                return False

    # 方法五: 進階:不將整數轉爲字符串來解決: 不使用log函數
    # 複雜度: O(n)
    def isPalindrome(self, x: int) -> bool:
        """
        只反轉後面一半的數字!!(節省一半的時間)
        """
        if x < 0 or (x!=0 and x%10==0):
            return False
        elif x == 0:
            return True
        else:
            reverse_x = 0
            while x > reverse_x:
                remainder = x % 10
                reverse_x = reverse_x * 10 + remainder
                x = x // 10
            # 當x爲奇數時, 只要滿足 reverse_x//10 == x 即可
            if reverse_x == x or reverse_x//10 == x:
                return True
            else:
                return False





x = 10
x = 10001
print(Solution().isPalindrome(x))

碼字不易,歡迎點贊,關注,精彩不斷,好題連連~~~

您的支持,是我不斷創作的最大動力~

歡迎點贊關注留言交流~

深度學習,樂此不疲~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章