判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

示例 1:

输入: 121
输出: true

示例 2:

输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

示例 3:

输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。

进阶:你能不将整数转为字符串来解决这个问题吗?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/palindrome-number

一开始进阶那部分的提示没有注意到,于是就反转字符串了。

/**
 * @param {number} x
 * @return {boolean}
 */
var isPalindrome = function (x) {
    //负数直接返回false
    if (x < 0) return false;
    //反转字符串
    var num = x.toString().split('').reverse().join('');
    //比较是否相等
    if (num === x.toString()) return true;
    return false;
};

我写完之后感觉这不太对劲。于是重新审题,才看到进阶的提示。
我在思考时没有想到反转一半就可以这种思路。后来看到官方给的方法,觉得自己的思路太憨了。我给改成js版本了

/**
 * @param {number} x
 * @return {boolean}
 */
var isPalindrome = function (x) {
    //首先负数肯定不是返回false
    //然后如果最后一位为0 而且要符合回文数规则的只有0自己本身 其他的都返回false
    if (x < 0 || (x % 10 == 0 && x != 0)) return false;
    var num = 0;
    //x%10 可以得到最后一位 然后再将x/10取整 得到了去掉最后一位的x
    //反转的num *10再加上x的最后一位就是反转后的数值
    //重复这一操作  当反转的数值大于或等于x时 可以得知已经反转了一半及以上的长度 于是停止循环
    while (x > num) {
        num = num * 10 + x % 10;
        x = parseInt(x / 10);
    }
    //如果x为奇数 只需要将反转的数值最后一位删除掉即可 中位的数值反转也本身
    return x == num || x == parseInt(num / 10);
};
var start = new Date();
console.log(isPalindrome(1234331));
var end = new Date();
console.log(end - start + " ms");
//这是每次循环计算结束时x 和 num 的值  方便理解
num = 1
x = 12343
num = 13
x = 1234
num = 133
x = 123
num = 1334
false
9 ms