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

解题思路

通常来说回文的话,我们按照暴力解法的思路肯定是将数字转为字符串,进行反转,再转回数字看看是不是一样。但是前面有过一题整数反转,其实我们可以利用相同的思路,使用数学方式将其反转,这样的话执行效率就会变高。

然后这里有两个特殊值,如果数字小于0那么一定不是回文数。如果数字为0的话,那么就是回文数。

数字反转的原理,将数字x对10进行求模,就能得到x的最低位的数字v,将这个最低位的数字v通过res = res * 10 + v变为新数字的最高位,然后x = Math.floor( x / 10)就可以削减位数,循环往复,就能将数字反转。

代码

var isPalindrome = function(x) {
if (x < 0) { //如果小于0 那么直接返回false
return false
}

if (x === 0) { //如果为0 那么直接返回true
return true
}

let result = 0 //结果
const originalX = x //保留原始的x的值

while (x > 0) { //循环降低位数,直到为0
const value = x % 10 //获取到最低位的数字
result = result * 10 + value //将最低位的数字填充到结果的最高位
x = Math.floor(x / 10) //将x降低位数
}

return result === originalX //对比前后是否一致
};

总结

涉及到数字反转或者一串数字字符转为一个完整的数字之类的题目都可以使用res = res * 10 + v的方式来避免使用拼接字符串转Number这种耗时的方式。