题目
给你一个整数 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;
};
方法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;
};
阴间写法--由对撞指针联想
第一次思考不转换成字符串时的结果,每次判断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);
};