LeetCode7 - 整数反转(Reverse Integer)

489 阅读2分钟

英文:leetcode.com/problems/re…

中文:leetcode-cn.com/problems/re…

题目描述

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例1:

输入: 123
输出: 321

示例 2:

输入: -123
输出: -321

示例 3:

输入: 120
输出: 21

注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为[−2^{31}, 2^{31}− 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

题解

/**
 * @param {number} x
 * @return {number}
 */
var reverse = function (x) {
    // 把数字转成字符串,再把字符串转成数组
    // 123 -> "123" -> ["1", "2", "3"]
    // -123 -> "-123" -> ["-", "1", "2", "3"]
    let arr = x.toString().split('');
    // 判断是否有负号
    if (arr[0] !== "-") {
        // ["1", "2", "3"] -> ["3", "2", "1"] -> "321" -> 321
        // 如果原数字是 120,在这一步用 Number() 会直接把0去掉
        let num = Number(arr.reverse().join(''));
        if (num <= Math.pow(2, 31) && num >= -Math.pow(2, 31)) {
            return num;
        } else {
            return 0;
        }
    } else if (arr[0] === "-") {
        delete arr[0];
        let num = Number(arr.reverse().join(''));
        if (num <= Math.pow(2, 31) && num >= -Math.pow(2, 31)) {
            // 取反之后,加1
            return ~num + 1;
        } else {
            return 0;
        }
    }
};

按位取反?

数字1按位取反:~1

1的二进制为: 00000001

按位取反之后:11111110

按位取反完成,再把这个二进制转成十进制

转十进制的时候,发现符号位(即最高位)为1,表示这是个负数

将除符号位之外的其他取反:10000001

末位加1取其补码:10000010

最后转成十进制:-2

负数二进制转十进制?

除去符号位减1;

除去符号位,按位取反;结果就是负数的原码;

原码转成相应的十进制

有符号二进制转十进制?

初始值 11110000

1:按位取反 00001111

2:将上一步得到的结果加 1 生成补码 00010000

3:转换为十进制 16