7.整数反转|刷题打卡

153 阅读1分钟

掘金团队号上线,助你 Offer 临门! 点击 查看详情

一、题目描述:

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

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

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

示例 1:

输入:x = 123
输出:321

示例 2:

输入:x = -123
输出:-321

示例 3:

输入:x = 120
输出:21

二、思路分析:

  • 依次对 x 的末位进行处理,即通过 x%10 取余获得个位数, 通过 x/10 替代现有 x,
  • 位运算符:| ,两个位只要有一个为1,那么结果都为1,否则就为0

三、AC 代码

/**
 * @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;
};
执行用时:92 ms

内存消耗:39.2 MB


四、总结

  • 当然不止一种方法,也看到很多方法实现,大概思路很类似;
/**
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {
    let res = 0;
    while(x){
        res = res * 10 + x % 10;
        if(res > Math.pow(2, 31) - 1 || res < Math.pow(-2, 31)) return 0;
        x = ~~(x / 10); // 向下取整
    }
    return res;

};

执行用时:108 ms 内存消耗:39.3 MB

也看到有些使用字符串反转,再加判断

/**
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {
    let sign = Math.sign(x)
    let res = (Math.abs(x) + '').split('').reverse().join('') * sign
    if (res > Math.pow(2, 31) - 1 || res < Math.pow(2, 31) * -1) res = 0
    return res

};

仅供学习参考

参考题目