算法-回文数

108 阅读1分钟

题:给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

例如,121 是回文,而 123 不是。

示例 1:

输入:x = 121
输出:true
示例 2:

输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:

输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。

解法一:转换为数组,反转后转换为字符串与原数比较

function isPalindrome(x) {
  // 如果x是负数,则不是回文数
  if (x < 0) {
    return false;
  } else {
    //定义x2 解析字符串为整数 转为字符串 用‘’分割 位置颠倒函数 拼接字符串
    var x2 = parseInt(x.toString().split("").reverse().join(""));
    return x2 === x ? true : false;
  }
}

解法二:字符串反转解法

function isPalindrome(x) {
  // 1. x < 0 的数字一定不是回文数,因为 -121 不等于 121-
  // 2. 个位数是 0 的数字也一定不是回文数,0 除外
  if (x < 0 || (x % 10 === 0 && x !== 0)) {
    return false;
  }
  let s = String(x),
    rs = "";
  for (let i = s.length - 1; i >= 0; i--) {
    rs += s[i];
  }
  return s === rs;
}

解法三:数字反转法

var isPalindrome = function(x) {
  if(x < 0 || (!(x % 10) && x)) return false;
  let x2 = x, res = 0;
  while(x2){
      res = res * 10 + x2 % 10;
      x2 = ~~(x2 / 10);
  }
  return res === x;
};

解法四:拿前一半数于后一半数对比(效率高)

解法三的优化,在整数反转过程到一半的时候,其实我们就可以判断是否是回文数了,作为优化项

function isPalindrome(x) {
  // 1. x < 0 的数字一定不是回文数,因为 -121 不等于 121-
  // 2. 个位数是 0 的数字也一定不是回文数,0 除外

  if (x < 0 || (x % 10 === 0 && x !== 0)) {
    return false;
  }

  let reversedNumber = 0;
  // 将后一半的数进行反转
  while (x > reversedNumber) {
    reversedNumber = reversedNumber * 10 + (x % 10);
    x = Math.floor(x / 10);
  }
  // 位数是偶数,x === reversedNumbe,判断前一半x和后一半reversedNumber是否全等,
  // 位数是奇数,x === Math.floor(reversedNumber / 10),判断后一半reversedNumber去掉最后一位(即原本是中间的数字)后,是否和前一半x全等
  return x === reversedNumber || x === Math.floor(reversedNumber / 10);
}

解法五:双指针法

var isPalindrome = function(x) {
    let temp = x.toString()
    const n = Math.floor(temp.length / 2)
    for(let i = 0; i < n; i++){
        if(temp[i] != temp[temp.length-i-1]) return false
    }
    return true
};