Leetcode 7. 整数反转

57 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

1.描述

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

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

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

输入:x = 123  
输出:321

2.思路

本题是需要我们将一个有符号的整数X进行反转,但是不反转其符号部分,只反转数字部分就可以了,并且在反转的过程中需要判断反转后的数字是否超过了2的31次方-1或者-2的31次方,如果超过这部分就返回0。

那么首先我们考虑反转后的数字肯定要做一次比较,如果超过这个范围就需要返回0

if (num < Math.pow(-2, 31) || num > Math.pow(2, 31) - 1) {
    return 0;
}

然后来做对整数X的反转部分,首先做反转的话,我们可以想到栈这种数据结构,利用栈后进先出的特性,我们在将数字加入一个栈中然后再依次出栈,就可以得到反转之后的数字,并且在我们出栈的过程中同时可以乘以10的数字位数次方,然后进行一个比较,是否超出了规定的范围,比如用第一个出栈的数字乘以数字的总长度,乘积如果超过了范围那就可以直接返回0,而不需要继续比较,如果位数相同且头数字相等的话则继续比较,否则的话就直接一直进行出栈,然后返回拼接符号后的数字

使用栈空间来处理的话,我们需要先入栈再出栈,比较的麻烦,那除了使用这种栈空间来做中转的情况以外,我们是否还能有其他办法来处理反转呢。

我们可以考虑一种情况,余数,数字除以10的余数就是数字的未尾数字,我们可以通过这个办法,来获取到尾数,然后将数字x更新为除以10以后的数字,同时将上次的尾数乘以10再加上本次的尾数得到最新的尾数,来继续进行这个循环,这样我们就可以计算出最终反转后的数字,那么我们是不是也可以不用等到最后才进行一个比较,我们只需要在每次计算完最新反转尾数的最后进行一次比较,如果当前尾数已经超出了范围,那就不需要再继续循环比较后面的尾数了。

3.代码

    let rev = 0;
    while (x !== 0) {
        const digit = x % 10;
        x = ~~(x / 10);
        rev = rev * 10 + digit;
        if (rev < Math.pow(-2, 31) || rev > Math.pow(2, 31) - 1) {
            return 0;
        }
    }
    return rev;