天天看点

日常记录 :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)