【前端也得会算法】7. 整数反转 [ 中等 ]

602 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

一、题目描述:

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

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

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

示例:

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

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

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

示例 4:
输入: x = 0
输出: 0

提示:

  • -231 <= x <= 231 - 1

二、题解:

这道题意在 数字部分反转, 所以得考虑如何将数字反转。

有三种简单的方法:数组自尾部push,字符串自尾部拼接和数组的方法reverse直接翻转。

这道题有三个陷阱

- 翻转前是在某个范围内的,都是存在一种可能,即翻转后越界问题
- 翻转前最后一位或几位是0,翻转后需要舍去
- 翻转前后的符合问题

方法一 字符串拼接法

  • 原理。根据题解遍历放入合适的数字拼接即可。
  • 思路。
    • 如果为负数得先提取符号位,再规整数字(取绝对值)
    • 遍历
    • 利用取余提取最后一位
    • 拼接字符串且跳过最后一位或几位是0的情况
    • 利用除法+取整运算改变遍历的数字
    • 再判断边界问题

代码:

var reverse = function(x) {
    // 先排除0的特殊情况
    if(x===0){
        return 0
    }
    
    let resStr = ''
    // 如果为负数得先提取符号位,再规整数字
    if(x<0){
        resStr+='-'
        x = Math.abs(x)
    }
    // 如果x不为0
    while(x){
        // 利用取余提取最后一位
        let item = x%10
        // 如果此时resStr为空,且取余提取的数为0,则不做任何操作,跳过最后一位或几位是0的情况
        if(resStr.length || item!==0) {
            resStr+=item
        }
        // 利用除法+取整运算让x长度减少,失去最后一位
        x = parseInt(x/10)
    }
    resStr = Number(resStr)
    let bigNum = 2**31
    // 翻转后的边界问题
    if(resStr>bigNum-1 || resStr<-1*bigNum){
        return 0
    }
    return resStr
}

同理可替换为数组操作:

var reverse = function(x) {
    // 先排除0的特殊情况
    if(x===0){
        return 0
    }
    
    let resArr = []
    // 如果为负数得先提取符号位,再规整数字
    if(x<0){
        resArr.push('-')
        x = Math.abs(x)
    }
    // 如果x不为0
    while(x){
        // 利用取余提取最后一位
        let item = x%10
        // 如果此时resArr为空,且取余提取的数为0,则不做任何操作,跳过最后一位或几位是0的情况
        if(resArr.length || item!==0) {
            resArr.push(item)
        }
        // 利用除法+取整运算让x长度减少,失去最后一位
        x = parseInt(x/10)
    }
    resArr = Number(resArr.join(''))
    let bigNum = 2**31
    // 翻转后的边界问题
    if(resArr>bigNum-1 || resArr<-1*bigNum){
        return 0
    }
    return resArr
}

image.png

方法二 巧用数组方法

  • 原理。根据题解利用数组的reverse翻转数字拼接即可。
  • 思路。
    • 如果为负数得先提取符号位,再规整数字(取绝对值)
    • 遍历
    • 拼接reverse翻转后的数字
    • 再判断边界问题
  • 注意。这个方法得把数字先转化为字符串,再使用split切成数组才可

代码:

var reverse = function(x) {
    if(x===0){
        return 0
    }
    let resStr = ''
    if(x<0){
        resStr+='-'
        x = Math.abs(x)
    }
    resStr += String(x).split('').reverse().join('')
    resStr = Number(resStr)
    let bigNum = Math.pow(2,31)
    if(resStr>bigNum-1 || resStr<-1*bigNum){
        return 0
    }
    return resStr
};

image.png

三、总结

  • 此题可以字符串拼接法巧用数组方法两种方案
  • 字符串拼接法主要是根据题解遍历放入合适的数字拼接即可。
  • 巧用数组方法主要是根据题解利用数组的reverse翻转数字拼接即可。

文中如有错误,欢迎在评论区指正