2021 年 8 月 29 日 链接:https://leetcode-cn.com/problems/palindrome-number/ 耗时:13m

题目

描述

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

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

示例

示例 1:
输入:x = 121
输出:true

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

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

示例 4:
输入:x = -101
输出:false

限制

  • -231 <= x <= 231 - 1

    解答

    思路

  • 去除边界,小于 0 不考虑

  • 根据回文数的定义,只需保证中心左右两边的每位数字在与中心位置的距离相同时,它们的值也是相同的
  • 将文字转字符串,中心位置左边距离中心最近的字符的索引记为 middle = Math.floor(length / 2) - 1,则中心位置右边距离中心最近的字符的索引为 (length - 1 - middle)
  • 遍历从 middle 到 0 的每个字符,只需保证它们与 length - 1 - middle 到 length 所对应的每个字符相同即可确定是回文数

    代码

    1. /**
    2. * @param {number} x
    3. * @return {boolean}
    4. */
    5. var isPalindrome = function(x) {
    6. if(x < 0) {
    7. return false
    8. }
    9. const xString = x + ''
    10. const xStringLength = xString.length
    11. // 取左边距离中心最近的字符的索引
    12. const middle = Math.floor(xStringLength / 2) - 1
    13. // 从 middle 遍历到 0
    14. for(let i = middle; i >= 0; i --){
    15. if(xString[i] !== xString[xStringLength - 1 - i]){
    16. return false
    17. }
    18. }
    19. return true
    20. };

    优化

    image.png

  • 直接操作数字,使用反转实现

  • 需要考虑边界情况,尾数是 0 且不等于 0 的情况不能参与反转
  • 参考链接:https://leetcode-cn.com/problems/palindrome-number/solution/hui-wen-shu-by-leetcode-solution/

    代码

    /**
    * @param {number} x
    * @return {boolean}
    */
    var isPalindrome = function(x) {
      if(x === 0){
          return true
      }
      if(x < 0){
          return false
      }
      if(x % 10 === 0){
          return false
      }
      let invertNumber = 0
      while(x > invertNumber){
          invertNumber = (x % 10) + invertNumber * 10
          x = Math.floor(x / 10)
      }
      return x === invertNumber || x === Math.floor(invertNumber / 10)
    };