LeetCode《初级算法》字符串之整数反转 -- JavaScript

1,124 阅读2分钟

题目

题目链接:leetcode-cn.com/leetbook/re…

image.png


题解


1、转换成字符数组后再反转

要实现整数的反转,可能一下并不知道怎么实现,但是我们知道怎么实现数组的反转,于是可以按以下步骤实现整数反转:

  • 将整数转换成字符串;
  • 将字符串的每一位切割放到一个数组中;
  • 对数组进行反转;(通过数组反转实现字符串反转)
  • 将数组合并成字符串;(使用 maxStr 和 minStr 对合并后的字符串检查)
  • 将字符串转换成数字;

但是根据题目给出的条件:计算机只能存储 32 位有符号整数,当反转后的数字超过了存储范围时返回 0 ; 于是我们要在倒数第二步对字符串进行检测,判断字符串对应的整数其是否超出可存储范围;

/**
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {

    let str = String(x);
    let arr = str.split('');
    let isMinus = false;
    // maxStr 和 minStr 用来限制如果数字反转后超过两者后输出 0 ;
    let maxStr = (Math.pow(2,31) - 1).toString();
    let minStr = (0 - Math.pow(2,31)).toString();

    
    if('-' === arr[0]) {
        arr.shift();
        isMinus = true;
    }

    // 交换数组
    let head = 0,
        rear = arr.length - 1;

    while(head < rear) {

        arr[head] -= arr[rear];
        arr[rear] = Number(arr[rear]) + arr[head];
        arr[head] = arr[rear] - arr[head];
        head++;
        rear--;
    }


    //
    if(isMinus) {
        arr.unshift('-');
        str = arr.join('');

        if(str.length === minStr.length && str > minStr) {
            return 0 ;
        }
        return Number(str);

    }else{
        str = arr.join('');
        if(str.length === maxStr.length && str > maxStr){
            return 0;
        }
        return Number(str);
    }
};


2、进一步思考

如果没有 环境不允许存储 64 位整数 这个限制,那么可以直接在数值上进行反转,不用转换为数组;

/**
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {

    let num = Math.abs(x),
        result = 0;
    const MAX_VALUE = Math.pow(2,31) - 1,
        MIN_VALUE = 0 - Math.pow(2,31)

    while(0 !== num) {

        result = result * 10 + num % 10;

        num = ( num / 10) | 0;
        
    }


    if(x < 0) {
        result = (0 - result);
    }
    
    if(result > MAX_VALUE || result < MIN_VALUE) {
        return 0;
    }
    return result;
     
};

大家如果有更好的思路和解法,欢迎大家一起来讨论啊~


这是使用 JavaScript 对 LeetCode《初级算法》的每道题的总结和实现的其中一篇,汇总篇在这里:

juejin.cn/post/700669…