题目描述

https://leetcode.cn/problems/palindrome-number/description/

答案

function isPalindrome(x: number): boolean {
  // 特殊情况:
  // 1. x < 0: 负数不可能是回文数
  // 2. (x % 10 === 0 && x !== 0): 末尾为0的数不可能是回文数(除了0本身)
  if (x < 0 || (x % 10 === 0 && x !== 0)) {
    return false
  }
 
  let revertedNumber = 0
 
  // 反转后半部分数字
  while (x > revertedNumber) {
    // revertedNumber * 10: 将上一次循环中取到的最后一位 * 10
    // (x % 10): 取当前循环的最后一位 x
    // 到这里属于是得到回文数后半部分数字的反转版
    revertedNumber = revertedNumber * 10 + (x % 10)
    // 舍弃掉被取走的最后一位
    x = Math.floor(x / 10)
    // 例如 1221 从末尾开始, 分别取出 1、2 后组成 12, x 变成了 12
  }
 
  // x === revertedNumber: 例如 1221 最终判断 12 === 12
  // x === Math.floor(revertedNumber / 10): 当数字长度为奇数时,通过 revertedNumber/10 去除中位数, 例如 121, 最终判断 1 === 1
  return x === revertedNumber || x === Math.floor(revertedNumber / 10)
}
  • 时间复杂度: O(log n), 每次除以 10
  • 空间复杂度: O(1)