天天看點

日常記錄 :LeetCode 9題 回文數

因為有前面的題目 我首先想到就是雙指針 :

将數字轉成數組 然後由兩邊向中間移動

Golang:

func isPalindrome(x int) bool {
	// 因為所有的負數都不是回文數 不包括0的所有能被10整除的都不是回文數
    if x < 0 || (x % 10 == 0 && x != 0) {
        return false
    }
    // 所有的小于10的正整數 都是回文數
    if x >= 0 && x <= 9 {
        return true
    }
    number := []int{}
	for x != 0 {
		i := x % 10
		number = append(number,i)
		x = x / 10
	}

	left := 0;
	right := len((number)) -1 ;
	// 移動兩邊的指針 
	for left < right {
		if number[right] != number[left] {
			// 隻要發現兩邊指針 指向的數 不相同直接傳回 
			return false
		}
		left ++ ;
		right --;
	}
	
	// 最後傳回 
	return true
}
           

LeetCode 官方給出的解法 是尋找一半的對對應的一半是不是相等

Java:

class Solution {
    public boolean isPalindrome(int x) {
        // 前面的特殊條件判讀的一樣
        if( x < 0 || (x % 10 == 0 && x != 0)) return false;
		if( x >= 0 && x <= 9 ) return true ;
		
        int nb = 0;
        while (x > nb) {
            nb = nb * 10 + x % 10;
            x = x / 10;
        }
        // 因為奇數個 和 偶數個差別  121  最後 nb = 12  x = 1 
        // 是以 要雙重判斷 
        return ( nb == x || nb / 10 == x) ;
    }
}
           

python 還有一種解法 更加優美 :

class Solution:
    def isPalindrome(self, x: int) -> bool:
    	// 就這一行代碼 搞定!
        return str(x)[::-1] == str(x)