用JavaScript刷leetcode第9题-回文数

637 阅读1分钟

前言

  • 解这题的第一思路就是直接反转整个数字,然后与未反转前的数比较,相等说明是回文数,反之则不是回文数。
  • 然后自己优化了下边界判断,当传入的数是负数或者是10的倍数则一定不是回文数。
  • 看了leetcode题解后,其实只需要反转后一半的数字,与剩下的数字比较即可。

一、题目描述

leetcode地址

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

  • 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。

二、代码

git代码地址

2.1 反转整个数字

/**
 * @param {number} x
 * @return {boolean}
 */
 
const isPalindrome = function(x) {
  // 负数以及10的倍数一定不是回文数
  if(x < 0 || x % 10 === 0 && x !== 0) return false
  // 反转前
  const reverseBefore = x.toString()
  // 反转后
  let reverseAfter = ''
  // 倒序遍历
  for(let i = reverseBefore.length - 1; i >= 0; i--) {
    reverseAfter += reverseBefore[i]
  }
  // 返回比较结果
  return reverseBefore === reverseAfter
}

2.2 反转后一半数字

这里其实有个注意的地方,数字长度是奇数该怎么处理

/**
 * @param {number} x
 * @return {boolean}
 */
const isPalindrome = function(x) {
  // 负数 10的倍数一定不是回文数
  if(x < 0 || x % 10 === 0 && x !== 0) return false
  // 前一半,后一半反转对比
  let halfBefore = x
  let halfAfter = 0
  while(halfBefore > halfAfter) {
    halfAfter = halfAfter * 10 + halfBefore % 10
    halfBefore = Math.floor(halfBefore / 10)
  }
  // 数字长度为奇数时,去掉中间的那个数再比较
  return halfBefore === halfAfter || halfBefore === Math.floor(halfAfter / 10)
}