[路飞]_一起刷leetcode 9. 回文数

「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战

题目:

9. 回文数

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。

示例 1:

输入: x = 121
输出: true
复制代码

示例 2:

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

示例 3:

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

示例 4:

输入: x = -101
输出: false
复制代码

提示:

  • -231 <= x <= 231 - 1

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

暴力解法

思路

  1. 题目中提到 你能不将整数转为字符串来解决这个问题吗, 说明转成字符串来解决一定很简单, 那我们先来看看转成字符串解决有多简单;
  2. 字符串可以通过split切割成数组;
  3. 数组可以通过reverse进行倒序;
  4. 数组可以通过join拼接成字符串;
  5. 匹配转换前的字符串和转换后的字符串是否相等。

实现:

/**
 * @param {number} x
 * @return {boolean}
 */
var isPalindrome = function(x) {
    return String(x) === String(x).split("").reverse().join("");
};
复制代码

暴力解法数字版

思路

上面的暴力解法只是为了体验一下转成字符串有多简单,接下来我们正儿八经的开始解题。

  1. 由于是数字,那么负数肯定旋转后不一样, 所以小于0的淘汰;
  2. 尾数是0的,除了0本身,旋转后没有数字能以0开头,也淘汰;
  3. 每次从原数字x中取除最后一位, 放到result的最后;
  4. 比较原数字xresult是否相等。
/**
 * @param {number} x
 * @return {boolean}
 */
var isPalindrome = function(x) {
    // 边界 -- 负数和尾数为0的整数
    if (x < 0 || x % 10 === 0 && x !== 0) {
        return false;
    }

    // 个位数不用翻转
    if (x < 10) {
        return true;
    }

    let result = 0;
    // 找人代跑,待会儿比较用到x
    let temp = x;

    while (temp > 0) {
        // 把当前原本值的末位放到结果的末尾
        // 相当于一个个push进数组,再拿出来,完成了一次reverse
        result = result * 10 + temp % 10;
        temp = Math.floor(temp / 10);
    }

    return result === x;
};
复制代码

优化

其实我们不用比对全部数据,只需要比对前半截是否与后半截相等即可。即上述代码中的temp < result; 然后我们需要对不同情况进行处理:

  1. 数字为偶数位, 这种是最简单的, 判断 temp === result 是否符合, 比如数字1221
  2. 数字是奇数位, 这是temp < result, 比如数字12321, 这是temp = 12, result = 123, 我们需要处理数据result = Math.floor(result / 10) 后进行比较;
  3. 而且我们发现我们这一次不用对x原数据进行比较了,所以省掉一个变量temp直接操作原数据即可,勤俭持家。

优化代码

/**
 * @param {number} x
 * @return {boolean}
 */
var isPalindrome = function(x) {
    // 边界 -- 负数和尾数为0的整数
    if (x < 0 || x % 10 === 0 && x !== 0) {
        return false;
    }

    // 个位数不用翻转
    if (x < 10) {
        return true;
    }

    let result = 0;

    while (x > result) {
        // 把当前原本值的末位放到结果的末尾
        // 相当于一个个push进数组,再拿出来,完成了一次reverse
        result = result * 10 + x % 10;
        x = Math.floor(x / 10);
    }

    return result === x || Math.floor(result / 10) === x;
};
复制代码

看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。

猜你喜欢

转载自juejin.im/post/7032577526924836900