# 回文数

# 题目

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

示例 1:

输入: 121
输出: true

示例 2:

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

示例 3:

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

进阶:

你能不将整数转为字符串来解决这个问题吗?

力扣🔗:https://leetcode-cn.com/problems/palindrome-number (opens new window)

# 解题思路

# 解法一

  • 将传入整数转为字符串,依次遍历每个数字字符,判断与其对称的数字字符是否相等。

# 解法二

  • 首先获取该整数的数量级 n,公式是 10 ** ~~Math.log10(x)~~ 是两个按位非,用于取出整数部分,相当于 Math.floor()),例如 121 -> 100
  • 通过 ~~(x / n)x % 10 分别取到 x 的首末数字,例如 121 -> 1,1
  • 然后通过 ~~((x % n) / 10) 拿到去除 x 首末位的值,并更新 x, 例如 121 -> 1
  • 因此,我们只需要不断对比取出的首末位是否相等和更新 x 就可以判断该整数是否是回文。

# 代码实现

/**
 * @param {number} x
 * @return {boolean}
 */
function isPalindrome(x) {
  x = x.toString()
  const l = x.length

  for (let i = 0; i < parseInt(l / 2); i++) {
    if (x[i] !== x[l - i - 1]) {
      return false
    }
  }
  return true
}

/* 解法二 */
function isPalindrome(x) {
  if (x < 0) return false
  if (x < 10) return true

  let n = 10 ** ~~Math.log10(x) // 拿到该整数的数量级

  while (n > 1) {
    // ~~(x / n) 取到当前 x 的第一位,x % 10 取到当前 x 末位
    if (~~(x / n) !== x % 10) {
      return false
    }

    x = ~~((x % n) / 10) // 去除 x 两端的数字,并更新 x
    n /= 100 // 因每次只对比 x 首末两个数字,也就是两个数量级,因此更新 n 数为 n / 100
  }

  return true
}