【前端也得会算法】- 9. 回文数 [ 简单 ]

136 阅读2分钟

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

一、题目描述:

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

二、题解:

方法一 暴力颠倒法

  • 原理。主要是通过数组的reverse()方法调换原字符串与之比较。

代码:

var isPalindrome = function(x) {
    return String(x) === String(x).split('').reverse().join('')
};

image.png

方法二 循环判断法

  • 原理。将每一次数组下标n的值和数组尾部倒数第n个对比(arr.length-1-n)。
  • 优化。筛除0,小于0,10的倍数这些特殊案例在进行循环

tips: 使用类似双指针的方案,循环数组的一半就已经结束了。

代码:

var isPalindrome = function(x) {
    if(x === 0) {
        return true 
    }
    if(x<0 || x%10===0){
        return false
    }
    let arr = x.toString().split('');
    let i = 0;
    let len = arr.length
    while(i<(len/2)) {
        if(arr[i] != arr[len-1-i] ){
            return false
        }
        i++;
    }
    return true
};
  • 双指针和此算法几乎效率一致

image.png

方案比较

方案一使用的是数组原始方法,灵活运用。 方案二使用的是循环比较,也排除掉了特殊的数字,速度多次试验稍快一点。

三、总结

  • 此题可以暴力颠倒法循环判断法两种方案
  • 暴力颠倒法主要是通过数组的reverse()方法调换原字符串与之比较。
  • 循环判断法将每一次数组下标n的值和数组尾部倒数第n个对比(arr.length-1-n)。

文中如有错误,欢迎在评论区指正