算法刷题-回文数

138 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

一、 题目描述

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

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

  • 例如,121 是回文,而 123 不是。
示例1

输入: x = 121
输出: true


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


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

二、思路分析

思路1

暴力解法

  • 判断几种情况不行,负数不行,尾数为0不行,只有0满足条件
  • 然后转化为字符串, 切割,反转,拼接,转化number,对比

思路2

头尾取中间比较

  • 判断几种情况不行,负数不行,尾数为0不行,只有0满足条件
  • 定义一个新值y,作为比较值,这个比较只比较到一半的位置
  • x取10的余数,得到了最后一位值,复制给新值y
  • x / 10 取整,
  • 现在满足条件,x>y ,继续比较
  • 再次进入,x%1取余,复制给y,但是复制之前y本身应该乘以10,再加上新的余数
  • x/10 再次取整
  • 剩下依次循环,直到x>y这个条件不满足为止
  • 这里有个情况,就是这个数字的长度,如果为偶数,那刚好,两边相等,可以直接比较
  • 如果长度为奇数的时候,这个时候我们就需要把y/10然后取整,再做比较

三、代码

暴力解法

let isPalindrome = function(x) {
  /**
   * 判断几种情况不行
   * 负数不行,尾数为0不行,只有0满足条件
   * */ 
  if (x < 0 || (x%10 === 0 && x !== 0)) {
    return false
  }
  /**
   * 转化为字符串, 切割,反转,拼接,转化number,对比
   * **/ 
  let newNum = Number(x.toString().split('').reverse().join(''))
  return newNum === x ? true : false

}

头尾中间比较

let isPalindrome = function(x) {
  /**
   * 判断几种情况不行
   * 负数不行,尾数为0不行,只有0满足条件
   * */ 
  if (x < 0 || (x%10 === 0 && x !== 0)) {
    return false
  }

  /**
   * 思路: 头尾比较
   *  定义一个新值y,作为比较值,这个比较只比较到一半的位置
   *  x取10的余数,得到了最后一位值,复制给新值y
   *  x / 10 取整,
   * 现在满足条件,x>y ,继续比较
   * 再次进入,x%1取余,复制给y,但是复制之前y本身应该乘以10,再加上新的余数
   * x/10 再次取整
   * 剩下依次循环,直到x>y这个条件不满足为止
   * 
   * 这里有个情况,就是这个数字的长度,如果为偶数,那刚好,两边相等,可以直接比较
   * 如果长度为奇数的时候,这个时候我们就需要把y/10然后取整,再做比较
   * 
   * **/ 
  let newNum = 0
  while(newNum < x) {
    newNum = x % 10 + newNum * 10 
    x = Math.floor( x / 10)
  }
  console.log(x, newNum)
  
  return x === newNum || x === Math.floor(newNum / 10)
}