JavaScript:leetcode_9. 迴文數(水題,三種方法)

題目說明

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

示例 1:

輸入: 121
輸出: true
示例 2:

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

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

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

解題思路一(字符串反轉)

  1. 第一反應數字轉字符串,然後前後對比。可以解決問題。

代碼實現一

/**
 * @param {number} x
 * @return {boolean}
 */
var isPalindrome = function(x) {
    let xStr = x + '';
    let mid = +(xStr.length >> 1) + (+xStr.length % 2);
    for (let i = 0; i < mid; i++) {
        if (xStr.charAt(i) != xStr.charAt(xStr.length - i - 1)) {
            return false
        }
    }
    return true;
};

解題思路二(求得x的位數,xLen = Math.log10(x))

  1. 求得長度,接下來跟字符串一樣了。
  2. parseInt(x / Math.pow(10, xLen)) 得到首位
  3. x % 10 得到尾位
  4. 對比是否相等

代碼實現二

/**
 * @param {number} x
 * @return {boolean}
 */
var isPalindrome = function(x) {
    if(x < 0) {
        return false
    }
    let xLen = parseInt(Math.log10(x));
    while(x >= 1) {
        if(x % 10 != parseInt(x / Math.pow(10, xLen))) {
            return false
        }
        x = x % Math.pow(10, xLen);
        x = parseInt(x /= 10);
        xLen-=2;
    }
    return true
};

解題思路三(反轉尾部)

  1. 這個是官方題解,反轉尾部,直到前半部分小於等於反轉後的尾部
  2. 將x的尾部移出來,反轉。一直到x剩下的前半部分等於或者小於反轉的尾部。
  3. 前半部分小於尾部,說明到了x的中間位。
    1. 跳出循環時,迴文數只有兩種情況。
    2. 第一種,x爲偶數,直接判斷首尾是否相同。
    3. 第二種,x爲奇數,尾部除以10,再進行判斷。

代碼實現三

/**
 * @param {number} x
 * @return {boolean}
 */
var isPalindrome = function(x) {
    if(x < 0 || (x % 10 == 0 && x > 9)) {
        return false
    }
    let xTail = 0;
    let length = 0;
    while(x > xTail) {
        xTail *= 10;
        xTail += x % 10;
        x = parseInt(x / 10);
        length++;
    }
    if (x == xTail || x == parseInt(xTail / 10)) {
        return true
    } else {
        return false
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章