likes
comments
collection
share

leetcode-9-回文数

作者站长头像
站长
· 阅读数 10

题目地址

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

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

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

示例 1:

输入: x = 121
输出: true

示例 2:

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

示例 3:

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

提示:

  • -231 <= x <= 231 - 1

进阶: 你能不将整数转为字符串来解决这个问题吗?

解题思路-基础

本题最简单的方式是需要转成字符串的,因为这样就可以通过判断输入数字转成的字符串是否是回文串来判断输入数字是否是回文数。 所以,我们首先可以通过 x+= ''x 转成字符串,接下来就是判断 x 是否是回文串的问题了。 之前的题目中我曾通过

x.split('').reverse().join('')

翻转字符串,得到翻转后的结果再和原字符串对比,如果相同,就是回文串,这一次我们采用双指针的方式判断 x 是否是回文串。

代码实现

function check(s){
    let l = 0
    let r = s.length-1

    while(l<r){
        if(s[l] !== s[r]){
            return false
        }
        l++,r--
    }

    return true
}
var isPalindrome = function(x) {
    if(x<0){
        return false
    }

    return check(x+'')
}

解题思路-进阶

回文串的性质是字符串翻转后和原字符串相同,所以如果把字符串的后半部分翻转,就应该和字符串的前半部门相同。 而回文数的性质和回文串类似,所以如果我们可以取到数字的后半部分翻转后的结果,再判断其和前半部分是否相同即可。 所以我们可以每次取输入数字的个位数作为翻转数字的个位,知道翻转数字大于等于输入数字,以 1221 为例:

x = 1221 reverseNum = 0
x = 122  reverseNum = 1
x = 12   reverseNum = 12

如果输入数字的长度为偶数,则如果是回文数的话,此时 x 应该等于 reverseNum; 如果输入数字的长度为奇数,则如果是回文数的话,此时 x 应该等于 Math.floor(reverseNum/10)。 但是这里要注意的是这种方法会误判大于0%10===0的情况,也就是 10 100 1000这样的数字,所以需要首先特判一下。

代码实现

var isPalindrome = function(x) {
    if(x<0){
        return false
    }

    if(x<10){
        return true
    }

    if(x%10===0){
        return false
    }

    let reverseNum = 0

    while(x>reverseNum){
        reverseNum = reverseNum*10 + x%10

        x = Math.floor(x/10)
    }

    return reverseNum === x || Math.floor(reverseNum/10) === x
}

至此我们就完成了 leetcode-9-回文数

如有任何问题或建议,欢迎留言讨论!