因為有前面的題目 我首先想到就是雙指針 :
将數字轉成數組 然後由兩邊向中間移動
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)