# 9 Palindrome Number (有圖)

用 two pointer 方向想真的變的好容易阿 / 拆解 Number 13331 要得到前後的 1 就是 Math.floor(13331/10000)、 13331 % 10

LeetCode

Determine whether an integer is a palindrome. 
An integer is a palindrome when it reads the same backward as forward.

input: 數字
output: 看看是不是回文
Example 1:

Input: 121
Output: true
Example 2:

Input: -121
Output: false
Explanation: From left to right, it reads -121. From right to left, it becomes 121-. Therefore it is not a palindrome.
Example 3:

Input: 10
Output: false
Explanation: Reads 01 from right to left. Therefore it is not a palindrome.

Follow up:

Coud you solve it without converting the integer to a string?

如何解

用 Two pointer 想這題變得非常容易,先轉成 array 然後前後比,不一樣就 return false

var isPalindrome = function(x) {
    if(x < 0) return false;
    let arr = x.toString().split('')
    let pointer = 0;
    let ind = arr.length - 1;
    while(pointer <= ind){
        if(arr[pointer] !== arr[ind]){
            return false
        }
        pointer ++;
        ind --;
    }
    return true;
};

console.log(isPalindrome(13331))
// Runtime: faster than 50.40% of JavaScript online submissions

改善

題目有說 Coud you solve it without converting the integer to a string? 的確多花了一些時間想,記得之前 202 Happy Number 曾經拆解過 Number,這題其實也一樣

var isPalindrome2 = function(x) {
    if(x < 0) return false;
    let digits = 1;
    // 先算出有幾位數 結果得到 digits = 10000
    while(x / digits >= 10){
        digits *= 10; 
    }
    while(x > 0){
        let first = Math.floor(x / digits);
        let last = x % 10;
        if(first !== last){
            return false
        }
        
        x =  Math.floor(x%digits / 10);
        // 因為比完頭尾所以少了兩位數 / 100
        digits = digits/100;
    }
    return true;
}
// Runtime: 184 ms, faster than 80.40% of JavaScript online submissions

學到什麼 ?

再一次練習如何拆解數字而不是轉字串又轉陣列運算

Last updated