1. 程式人生 > >【LeetCode題解】9_迴文數(Palindrome-Number)

【LeetCode題解】9_迴文數(Palindrome-Number)

9_迴文數(Palindrome-Number)

文章目錄

描述

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

示例 1:

輸入: 121
輸出: true

示例 2:

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

示例 3:

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

進階:

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

解法一:轉化為字串的比較

思路

將整數轉化為字串,比較逆序的字串與原字串是否相等即可。

Java 實現

class Solution {
    public boolean isPalindrome(int x) {
String reversedStr = (new StringBuilder(x + "")).reverse().toString(); return (x + "").equals(reversedStr); } }

Python 實現

class Solution:
    def isPalindrome(self, x):
        """
        :type x: int
        :rtype: bool
        """
        return str(x) == str(x)[::-1]

複雜度分析

  • 時間複雜度: O ( log 10 ( n ) ) O(\log_{10}(n)) ,其中, n n 表示該整數,整數的位數大約為 log 10 n \log_{10}n
  • 空間複雜度: O ( log 10 ( n ) ) O(\log_{10}(n))​

解法二:反轉數字的後半部分 ★

思路

對於這道題,我們可能會想到將整數直接反轉後進行比較,但是反轉的整數有可能大於最大的整數,從而造成整數溢位。因此,我們採用另一種做法——只反轉整數的後半部分,然後判斷整數的後半部分和前半部分是否相等,如果相等,則該整數就是一個迴文數。當然,進行反轉前需要進行一些邊界判定,例如整數是否為負數(負數不可能是迴文數)等。

Java 實現

class Solution {
    public boolean isPalindrome(int x) {
        if (x < 0 || (x % 10 == 0 && x != 0)) {
            return false;
        }
        
        int rev = 0;
        while (x > rev) {
            rev = rev * 10 + x % 10;
            x /= 10;
        }
        
        return x == rev || x == rev / 10;
    }
}

Python 實現

class Solution:
    def isPalindrome(self, x):
        """
        :type x: int
        :rtype: bool
        """
        if (x < 0) or (x % 10 == 0 and x != 0):
            return False
        
        rev = 0
        while x > rev:
            rev = rev * 10 + x % 10
            x = x // 10
            
        if rev == x or rev // 10 == x:
            return True
        else:
            return False

複雜度分析

  • 時間複雜度: O ( log 10 ( n ) ) O(\log_{10}(n)) ,其中 n n 表示輸入的整數
  • 空間複雜度: O ( 1 ) O(1)