回文数问题

138 阅读1分钟

题目

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 例如,121 是回文,而 123 不是。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/pa…

方法1:转为字符串,判断反转前后是否相等

/**
 * @param {number} x
 * @return {boolean}
 */
var isPalindrome = function(x) {
    let str=x.toString();
    let str_reverse=str.split('').reverse().join("");
    return str===str_reverse;
};

image.png

方法2:反转数字

怕溢出的话就反转一半,参考官方题解

/**
 * @param {number} x
 * @return {boolean}
 */
var isPalindrome = function(x) {
    if(x<0) return false;
    else if(x<10) return true;
    let reverse_x=0;
    let positive_x=x;
    let bit=-1
    while(x>0){
        bit=x%10;
        reverse_x=reverse_x*10+bit; 
        x=(x-bit)/10
    }
    console.log(reverse_x);
    return reverse_x===positive_x;
};

image.png

阴间写法--由对撞指针联想

第一次思考不转换成字符串时的结果,每次判断x最高位和最低位是否相等,去除最高位和最低位继续判断,麻烦之处在于数字高位0的处理。

/**
 * @param {number} x
 * @return {boolean}
 */
//获取位数
var getBit=function(x){
    let bit=0,j=x;
    while(j>=1){
        bit++;
        j/=10;
    }
    return bit;
}
//判断x的头尾是否相等
var isHeadEqualTail=function(x){
    let bit=getBit(x);//获取位数 
    if(bit<=1) return true;//个位数和0不用头尾是本身,不用判断
    let left=parseInt(x/(Math.pow(10,bit-1)));
    let right=x%10;
    if(left!=right) return false;//头尾不相等不是回文数
    x=(x%Math.pow(10,bit-1)-right)/10;//砍头去尾
    let bit_next=getBit(x);
    if(bit_next===0) return true;
    else if(bit_next<bit-2){//处理前面的0不保留的情况
        let zero_bit=bit-2-bit_next;
        if(x%Math.pow(10,zero_bit)===0) x=x/Math.pow(10,zero_bit);
        else return false;
    }
    return isHeadEqualTail(x);//迭代判断

}
var isPalindrome = function(x) {
    if(x<0) return false;//负数肯定不是回文数
    else return isHeadEqualTail(x);
};

image.png