[Leetcode解題] Palindrome Number - 前後指針解

4 November 2022
easy two-pointers

題目

9. Palindrome Number 給定一個整數 x,如果 x 是回文數,則返回 true;否則返回 false。

解題思路

這題要判斷一個整數(integer)是否可以是對稱的,我們首先可以先考慮三種情況:

  1. 正整數
  2. 負整數

很明顯,負整數一定不可能,因為範例直接指數負號也要一起考慮對稱,所以我們可以直接用一個判斷式解掉

而零的情況也很明顯是對稱,所以也可以直接解掉,我們所需考慮的只有正整數的狀況。

這題有一個偷吃步的方法,因為在Python中可以直接將數字轉成字串(string),所以我們可以直接轉換再將字串做倒序(reverse),然後判斷兩個字串若相等,即為對稱。

但若撇開這個方法,我們可以用一個序列(list)來存整數的每個位數(digit),作法跟轉換二進位的過程很像,轉換後,我們只需要用兩個指標,一個從前面看,一個從後面看,每次如果有不一樣的狀況即非對稱,這邊我們可以想一些在奇數個位數跟偶數個位數分別會是什麼狀況。

若是偶數個位數,等到從尾巴開始的指標(後稱tail)超過從頭開始的指標(後稱head)的時候,即結束,所以都沒有Return False的話即為True。

若是奇數個位數,當兩個指標指向同個位置的時候,即結束,也不用多判斷這次,因為同個位置一定相等。

所以我們在while迴圈的條件可以設定成:tail > head

實作

class Solution:
    def isPalindrome(self, x: int) -> bool:
        if x == 0:
            return True
        if x < 0:
            return False
        
        # Convert it to a list
        digits = []
        while x != 0:
            digit = x % 10
            digits.append(digit)
            x = x // 10
        i = 0
        while len(digits)-1-i > i:
            if digits[i] != digits[len(digits)-1-i]:
                return False
            i += 1
        return True

時間複雜度

接下來我們可以來思考一下時間複雜度

在零跟負數的情況直接用判斷式解掉,所以是O(1)

在拆解數字的步驟,我們要遍歷每個位數,所以是O(n),令n = 位數,所以n < 32

而最後做指標判斷,最多跑n/2次,所以也是O(n)

所以整體時間複雜度為O(n)