LeetCode刷题挑战:7. 整数反转

328 阅读1分钟

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

题目

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。

示例 1:

输入:x = 123

输出:321

示例 2:

输入:x = -123

输出:-321

示例 3:

输入:x = 120

输出:21

示例 4:

输入:x = 0

输出:0   提示: -231 <= x <= 231 - 1

解题思路

我的第一想法就是把数字Number通过toString方法转化为字符串String,再通过split拆分字符串得到一个数组Array,再通过数组的reverse方法实现反转。再将Array数组通过join拼接回字符串,最后用parseInt变为Number类型。

因为分割成字符数组的原因,最后一步处理的String在x<0时会失去结尾的负号,所以x<0时结果加负号。

最后return时用三元表达式进行判断,以满足题目要求。

方法一:暴力拆分为字符串求解

/**
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {
    let result = parseInt(x.toString().split('').reverse().join(''));
    if (x < 0) {
        result = -result;
    }
    return result > 2147483647 || result < -2147483648 ? 0 : result;
};

除了自己想到的这种方法外,参考题解得到了一种更新奇的解决办法 —— 就是通过数学运算来反转整数。

通过对整数取余(%)可以得到最后一位数,/则可以得到除去最后一位数的10的倍数的一个新数。 例如:123%10 = 3;123/10 = 120。由此则可以有以下的解法。

方法二:数学法

/**
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {
    let result = 0;
    while(x !== 0) {
        result = result * 10 + x % 10;
        x = x/10 | 0;
    }
    return (result | 0) === result ? result : 0;
};

注意:

要区分 ||| 的区别

  • 定义不同:

    ||和|都是表示“或”,区别是||只要满足第一个条件,后面的条件就不再判断,而|要对所有的条件进行判断。

  • 与操作和或操作的区别

    (1)在程序中,使用与操作,要求所有表达式的判断结果都是TRUE,才为真,若有一个为FALSE,那么最终判断结果则为FALSE

    (2)使用或操作,只要其中有一个表达式为TRUE,那么最终的结果就为TRUE,只有当所有的表达式为FALSE时最终结果才为FALSE

  • 实际含义不同:

    "||" : 如果左边计算后的操作数为true,右边则不再执行,返回true;

    "|" : 前后两个操作数都会进行计算。也就是说:“|”不存在短路。

当使用|时,若前面的表达式为真时,程序会继续执行后面的表达式,然后在得出TRUE的结果

当使用||(短路或)时,若前面的表达式结果为真,则程序不会再执行后面的表达式,直接得出TRUE的结果