题:给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121 是回文,而 123 不是。
示例 1:
输入:x = 121
输出:true
示例 2:
输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。
解法一:转换为数组,反转后转换为字符串与原数比较
function isPalindrome(x) {
// 如果x是负数,则不是回文数
if (x < 0) {
return false;
} else {
//定义x2 解析字符串为整数 转为字符串 用‘’分割 位置颠倒函数 拼接字符串
var x2 = parseInt(x.toString().split("").reverse().join(""));
return x2 === x ? true : false;
}
}
解法二:字符串反转解法
function isPalindrome(x) {
// 1. x < 0 的数字一定不是回文数,因为 -121 不等于 121-
// 2. 个位数是 0 的数字也一定不是回文数,0 除外
if (x < 0 || (x % 10 === 0 && x !== 0)) {
return false;
}
let s = String(x),
rs = "";
for (let i = s.length - 1; i >= 0; i--) {
rs += s[i];
}
return s === rs;
}
解法三:数字反转法
var isPalindrome = function(x) {
if(x < 0 || (!(x % 10) && x)) return false;
let x2 = x, res = 0;
while(x2){
res = res * 10 + x2 % 10;
x2 = ~~(x2 / 10);
}
return res === x;
};
解法四:拿前一半数于后一半数对比(效率高)
解法三的优化,在整数反转过程到一半的时候,其实我们就可以判断是否是回文数了,作为优化项
function isPalindrome(x) {
// 1. x < 0 的数字一定不是回文数,因为 -121 不等于 121-
// 2. 个位数是 0 的数字也一定不是回文数,0 除外
if (x < 0 || (x % 10 === 0 && x !== 0)) {
return false;
}
let reversedNumber = 0;
// 将后一半的数进行反转
while (x > reversedNumber) {
reversedNumber = reversedNumber * 10 + (x % 10);
x = Math.floor(x / 10);
}
// 位数是偶数,x === reversedNumbe,判断前一半x和后一半reversedNumber是否全等,
// 位数是奇数,x === Math.floor(reversedNumber / 10),判断后一半reversedNumber去掉最后一位(即原本是中间的数字)后,是否和前一半x全等
return x === reversedNumber || x === Math.floor(reversedNumber / 10);
}
解法五:双指针法
var isPalindrome = function(x) {
let temp = x.toString()
const n = Math.floor(temp.length / 2)
for(let i = 0; i < n; i++){
if(temp[i] != temp[temp.length-i-1]) return false
}
return true
};