LeetCode 9 Palindrome Number (Tag:Math Difficulty:Easy)

154 阅读2分钟

这是我参与11月更文挑战的第19天,活动详情查看:2021最后一次更文挑战

前言

关于 LeetCode 数组类型题目的相关解法,可见LeetCode 数组类型题目做前必看,分类别解法总结了题目,可以用来单项提高。觉得有帮助的话,记得多多点赞关注哦,感谢!

题目描述

给你一个整数 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

链接:leetcode-cn.com/problems/pa…

题解

  1. 转换为字符串。我们可以将数字转换为字符串,然后通过循环比较字符串两端的字符是否相等来判断是不是回文数。具体代码如下,时间复杂度为 O(logn)
/**
 * @param {number} x
 * @return {boolean}
 */
var isPalindrome = function(x) {
  const x_str = String(x)
  const n = x_str.length
  let l = 0
  let r = n - 1
  while (l < r) {
      if (x_str[l] !== x_str[r]) {
          return false
      }
      l ++
      r --
  }
  return true
};
  1. 数学方式找出头和尾的数字来判断是否是回文数。具体做法就是取出最大位数上的数字和最小位数上的数字,判断是否相等,然后去头去尾成新的数字继续判断。具体代码如下,时间复杂度 O(logn)
/**
 * @param {number} x
 * @return {boolean}
 */
var isPalindrome = function(x) {
  if (x < 0) return false
  let div = 1
  while (Math.floor( x / div ) >= 10) {
    div *= 10
  }
  while (x > 0) {
      let r = x % 10
      let l = Math.floor(x / div)
      if (l !== r) return false
      x = Math.floor((x % div) / 10)
      div /= 100
  }
  return true
};
  1. 取出后半部分的数字和前半部分来比较,同样是通过数学的方法。最后取出的后半部分可能位数大于左半部分,所以要同时比较除以10和不除以10的部分是否相等。具体代码如下,时间复杂度 O(logn)
/**
 * @param {number} x
 * @return {boolean}
 */
var isPalindrome = function(x) {
    if (x < 0 || (x % 10 === 0 && x !== 0)) return false;
    let revertedNumber = 0;
    while (x > revertedNumber) {
        revertedNumber = revertedNumber * 10 + x % 10;
        x = Math.floor(x / 10);
    }
    return x === revertedNumber || x === Math.floor(revertedNumber / 10);
};