js - leetCode-回文数

481 阅读1分钟

这是我参与2022首次更文挑战的第10天,活动详情查看:2022首次更文挑战

前言

有人相爱,有人夜里开车看海,有人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

 

提示:

-231 <= x <= 231 - 1

数字翻转对比法

思路

  • 首先判断是否大于0
    • 小于0
      • 负数一定不是一个回文数,直接返回false
    • 大于等于
      • 首先把数字转为字符串,然后通过split方法把字符串切割成数组,类似这样的[1,2,3],然后使用数组reverse方法翻转数组,再把数组转为字符串
      • 然后通过parseInt把字符串转为数组
      • 最后对比转后的数字和传入的数字,是否一致,一致的话,表示当前传入的数组是一个回文数,返回true,否则返回false

解法

var isPalindrome = function (x) {
    if (x < 0) return false
    let reverseStr = parseInt(x.toString().split('').reverse().join(''))
    return reverseStr === x
};

字符串首尾对比法

思路

  • 首先判断是否大于0
    • 小于0
      • 负数一定不是一个回文数,直接返回false
    • 大于等于0
      • 首先把数字转为字符串,并且获取当前字符串的长度
      • while循环字符串的长度
      • 判断,当前字符串的长度是否等于1
        • 等于1
          • 表示它一定是一个回文数,直接返回true
        • 否则
          • 判断字符串的第一项最后一项是否相等
            • 相等
              • 删除字符串中的第一项和最后一项
              • 同时,字符串长度 - 2
              • 进行下一次循环
            • 不相等 表示不是回文数,直接返回false
      • 循环结束后,仍然没有返回值,那么证明传入的数字一定是个回文数,返回 true即可

解法

var isPalindrome = function (x) {
    if (x < 0) return false
    let str = x.toString()
    let strLth = str.length
    while (strLth) {
        if (strLth === 1) return true
        if (str[0] === str[strLth - 1]) {
            strLth -= 2
            str = str.substring(1)
            str = str.substring(0, strLth)
        } else {
            return false
        }
    }
    return true
};

反转一半数字

思路

  • 首先我们判断负数、能被10整除的数都不是回文数, 直接返回false
  • 接下来,我们要考虑怎么把数字翻转一半,进行对比
  • 假如现在有个数字1221,可以通过1221%10得到最后一个数1
  • 想要得到倒数第二个数,那么就要先把原来的数除以10,再取余Math.floor(1221/10) = 122,再对122%10就得到了2
  • 如果这个时候我们把最后一位数*10再加上倒数第二位数,1*10 + 2 = 12,就能获取到反转后的数字了
  • 接下来,我们可以通过在每次操作完翻转数字后,对源数据进行/10的操作,通过对比修改后的源数据和反转后的数据即可
  • 又因为,我们不确定要判断多少次,所以使用while循环
  • 循环完成后
    • 如果传入的数值是偶数,直接对比 x和反转后的数据reverseNum即可
    • 如果传入的数值是奇数的话,需要把反转后的数据/10之后再和x进行对比

解法


function isPalindrome1(x) {
    if (x < 0 || (x % 10 === 0 && x !== 0)) return false
    let reverseNum = 0
    while (x > reverseNum) {
        reverseNum = x % 10 + reverseNum * 10
        x = Math.floor(x / 10)
    }
    return x === reverseNum || x === Math.floor(reverseNum / 10)
}

写在最后

  • 希望你能收获满满