LC7. 整数反转(第19题)

104 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

菜鸟就要从第19题继续

一、题目描述:

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

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

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

输入:x = 123 输出:321 示例 2:

输入:x = -123 输出:-321 示例 3:

输入:x = 120 输出:21 示例 4:

输入:x = 0 输出:0

提示:-231 <= x <= 231 - 1

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/re… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

第一版:这道题如果不考虑范围限制,则只要依次对各个位数进行翻转即可,因此采用求余的方式进行循环判断。并注意正负的影响。但这里对正负的考虑其实是不必要的。使用Math.pow()进行幂运算

第二版:参考官方解答,注意到求余操作,对于负数也是同样直接成立的,判断条件改为!==0即可。注意这里取整的方式使用~~去掉小数部分

  • ~是按位取反运算,
  • ~~是取反两次

三、AC 代码:

1、第一版

/**
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {
    let symbol = 0
    let result = 0
    if(x<0){
        symbol=1
        x=-x
    }
    while(x>0){
        temp =x %10
        result= result*10+temp
        x=(x-temp)/10
    }
    result = Math.pow(-1,symbol)*result
    if (result < Math.pow(-2, 31) || result > Math.pow(2, 31) - 1) {
            return 0;
     }
    return result
};

2、第二版

/**
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {
    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;
};