前端算法(9)

85 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

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

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

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

输入: x = 121
输出: true

解题思路

思路一

我们先将整数转为可以利用索引的形式,整数转换为字符串,在 将字符串长度对半向下取整表示循环的次数,字符串从前向后从后向前判断是否相等,由于正整数只有个位数时字符串长度对半向下取整为0,所以单独判断,负整数有符号长度至少为2可进入循环不用单独判断

var isPalindrome = function(x) {
    if(x>=0&&x<10) return true
   let a=x.toString()
   const n=Math.floor(a.length/2)
   for(let i=0;i<n;i++){
       if(a[i]!=a[a.length-i-1]){
           return false
       }
   }
   return true 
};

思路二

我们也可以利用运算的方式进行解题,先反转一半的数字,因为回文数前面一半和后面一半是相同的,所以把后面一半从后向前逐个获取到,同时把获取到的数字从原数字中去除,排除不可能是回文的情况,第一种情况是小于0也就是 -x,第二种情况是余数为0且不等于0,从而我们根据此去定义一个接收参数,再进行循环,每次循环时新参数都需要乘以10,然后再加上此次循环得到的反转数字,这样才会达到反转的效果,原数字则除以10并去除小数点后面的内容,当原数字小于等于自定义参数时则循环结束,此时就可以判断了,这是还要再考虑到数字长度时奇数的情况

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