# [9] 回文数

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

示例 1:

输入: 121

输出: true

示例  2:

输入: -121

输出: false

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

示例 3:

输入: 10

输出: false

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

进阶:

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

这道题最容易想到的方法就是将数字转换成字符串,直接用首尾指针匹配一一匹配即可。

function isPalindrome(x: number): boolean {
  if (x < 0) return false;

  const str = x.toString();
  const len = str.length;

  const mid = Math.floor(str.length / 2);
  if (len % 2 === 0) {
    return palindrome(mid - 1, mid);
  }
  return palindrome(mid, mid);

  function palindrome(l: number, r: number) {
    while (l >= 0 && r < len && str[l] === str[r]) {
      l -= 1;
      r += 1;
    }
    if (l >= 0 || r < len) {
      return false;
    }
    return true;
  }
}

但是题目要求不能进行类型转换,那么就得用数学的方式来解决这个问题。

首先找到一个能除 x 结果为个位的除数,从而获得首位的值,再对 x 对 10 取余从而得到末位的值。两相比对,不同则直接返回 false。若相同,将 x 的值对除数取余再除以 10,除数除以 100,目的是为了让 x 去除首末两位数,从而进入下一次迭代。直到 x <= 0 时,说明此时已经没有首末位可供判断,迭代结束,返回 true。

function isPalindrome(x) {
  if (x < 0) return false;
  // 判断能相除能取x首位的除数
  let divisor = 1;
  while (x / divisor >= 10) divisor *= 10;

  while (x > 0) {
    const l = Math.floor(x / divisor);
    const r = x % 10;
    if (l !== r) return false;
    x = ((x % divisor) - r) / 10;
    divisor /= 100;
  }
  return true;
}