leetcode的第9題:迴文數

小白找兔子發表於2020-12-19

題目描述

判斷一個整數是否是迴文數。迴文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數
示例 1:
輸入: 121
輸出: true

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

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

解題思路

先排除幾種特殊的情況,負數不可能是迴文數,個位數為0的非零數字不是迴文數,0為迴文數

思路一

將傳入的數字轉換成字串,再轉換成陣列,接著利用陣列方法reverse()進行翻轉,再轉換為字串,需去除逗號,再轉換成整數,然後與原數進行比較從而判斷是否為迴文數。程式碼如下:

/**
 * @param {number} x
 * @return {boolean}
 */
//藉助字串的實現
var isPalindrome = function(x) {
  if(x < 0) return false;
  return x === x.toString().split('').reverse().toString().replace(/,/g,'') * 1
};

思路二
利用第七題的翻轉整數,然後將結果與原數比較得出是否為迴文數,程式碼如下:

/**
 * @param {number} x
 * @return {boolean}
 */
 
var isPalindrome = function(x) {
  if(x < 0 | x % 10 === 0) return false;
  let num = x;
  let result = 0;
  while(Math.floor(num) !== 0) {
     result = result * 10 + num % 10;
     num = Math.floor(num/10)
  }
  console.log(result);
  return x === result
};

思路三

基於思路二的解題思路,只需翻轉一半的整數n,再與那剩下的一半x進行比較,重而判斷是否為迴文數,通過翻轉的一半n大於或等於剩下的一半x,來確定是否翻轉了一半,此時有兩種情況:n == x 或 n > x,前者直接返回true,後者這要考慮n比x多出一位,並且這一位是原數的中間位置,現在則在n的個位數上,通過除10取餘數後再進行比較,程式碼如下:

/**
 * @param {number} x
 * @return {boolean}
 */
 var isPalindrome3 = function(x) {
  if(x < 0 | (x % 10 === 0 && x !== 0)) return false;
  let n = 0;
  while(x > n) {
    n = n * 10 + x % 10;
    x = Math.floor(x/10)
  }
  return x === n || x === Math.floor(n / 10)
}

思路四:
將原數轉換成字串後,利用字串的charAt()方法,不斷比較從頭出發和從尾出發的數字是否相等,若不等著返回false,走完字串則返回true,程式碼如下:

/**
 * @param {number} x
 * @return {boolean}
 */
var isPalindrome = function(x) {
  if(x < 0 | (x % 10 === 0 && x !== 0)) return false;
  let xStr = x.toString();
  let leftIndex = 0;
  let rightIndex = xStr.length - 1;
  while(leftIndex < rightIndex) {
    let leftNum = xStr.charAt(leftIndex++);
    let rightNum = xStr.charAt(rightIndex--);
    if(leftNum !== rightNum) return false
  }
  return true
}

相關文章