题目介绍
思路
这次不让把数字转换成字符串了, 所以要换个思路了。
比较常用的方法就是 取模。
首先要排除几种情况:
- x为0, 肯定是回文数字
- x超出阈值 或者为负 或者末尾为0的数字, 都不是回文数字。
然后考虑正常的数字情况,假定x是123:
- x如果是回文,那么x反转之后的值,一定是等于x本身的。所以本题目标是反转数字x,然后进行比较。
- 这次采取逐步剥离x的方法
- 首先,用变量y获取到初始的x值,即123 , 然后设置反转后的数字为num
- 对x做第一层剥离:x % 10 = 3 ,然后把3从x中去掉,让x变成12 . 然后让num去接收剥离后的数字。 即现在num = 3 .
- 对x做第二层剥离: x % 10 = 2, 然后把2 从x中去掉,让x变成1 . 然后让num接收剥离后的两个数字,一个是3,一个是2, 稍微处理, 3* 10 + 2 = 32, 那么num现在就是32, 而x现在是1 .
- 对x做第三层剥离: x % 10 = 1, 然后把1从x中去掉,x就变成了0, 然后让num接收剥离后的第三个数字,一个是前面的32, 一个是刚接收的1 ,稍微处理, 32 * 10 + 1 = 321 ,此时的num就是321, 而x现在变成了0
- 当x变成了0, 剥离结束。
- 这时的y是最初的x值,即123, 而num是反转后的值, 即321
- 就看y和num是不是相等,如果相等,那么x就是回文数字。 如果不相等, x就不是回文数字。
代码
思路已经打开, 现在直接写代码:
/**
* @param {number} x
* @return {boolean}
*/
var isPalindrome = function(x) {
if(x === 0) {
return true;
}
if(x > (Math.pow(2, 31) - 1) || x < (- Math.pow(2, 31)) || x < 0 || (x % 10 === 0)) {
return false;
}
var num = 0, y = x;
while(x > 0) {
num = num * 10 + x % 10;
x = Math.floor(x / 10);
}
return num === y;
};