【算法】字符串:整数反转

106 阅读2分钟

题目:整数反转

leetcode链接:整数反转

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

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

理解:

1、有一个整数,需要得到反转后的值

2、该整数不能以0开头

3、保留整数的符号位

4、该整数反转后的值不能小于-2的31次方,也不能大于2的31次方-1

思路:

1、数字转字符串数组,然后利用双指针进行反转,之后再生成字符串,去掉开头的0,之后转数字再判断是否超过范围

2、记rev为翻转后的数字,为完成翻转,我们可以重复「弹出」x的末尾数字,将其「推入」rev的末尾,直至 x 为 0。

要在没有辅助栈或数组的帮助下「弹出」和「推入」数字,我们可以使用如下数学方法:

// 弹出 x 的末尾数字 digit

digit = x % 10

x /= 10

将数字 digit 推入 rev 末尾 rev = rev * 10 + digit

题解:

方案一:该方案存在各种类型转换,略显繁琐,效率也不高,尤其空间复杂点几乎到了历史最低点

/**  
 * @param {number} x  
 * @return {number}  
 */  
var reverse = function(x) {  
    let str = (x + '')  
    let arr = []  
    const len = str.length  
    for (let i = 0; i < len; i++) {  
        arr.push(str[i])  
    }  
    for (let left = 0, right = len - 1; left < right; ++left, --right) {  
        [arr[left], arr[right]] = [arr[right], arr[left]];  
    }  
    str = arr.join('').replace(/^0*/g'') 
  
    if (x >= 0) {  
        const num = str * 1  
        return num > Math.pow(231) - 1 ? 0 : num  
    } else {  
        str = str.slice(0, str.length - 1)  
        const num = -(str * 1)  
        return num < Math.pow(-231) ? 0 : num  
    }  
};

企业微信截图_16687771031758.png

方案二:数学知识

/**  
 * @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(-231) || rev > Math.pow(231) - 1) {  
            return 0;  
        }  
    }  
    return rev;  
};

企业微信截图_16687766861996.png

总结:

本题方案一相对容易想出来,但是过程比较繁琐,方案二需要一定的数学知识并灵活运用,相对来说,可能不那么容易想到,但是代码简单,效率也相对高。