算法题-JS实现整数反转

学习目标:


学习内容:

给你一个 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

提示:

  • -2^31 <= x <= 2^31 - 1

解题思路1:
利用数组的reverse方法,首先判断是否为负数,如果为负数则记录下来并转换为不带符号的数字,然后转为数组再通过reverse方法反转后,变回数字,根据之前的负数记录选择是否乘-1,最后返回(注意判断一下边界值)。

代码如下:

/**
 * @param {string} s
 * @return {number}
 */
// 1.转数组,利用数组的reverse方法
var reverse = function (x) {
    let result = 0, // 最后返回的数
        Max = Math.pow(2, 31),  // 最大边界值
        str = x + '',
        minus = false;  // 是否是负数
    let arr = str.split('')
    if (arr[0] === '-') {
        minus = true
        arr.splice(0, 1)
    }
    arr.reverse()
    str = arr.join('')
    result = minus ? +str * -1 : +str  // 判断是否是负数,是就转成数字后乘-1
    return result > Max || result < Max * -1 ? 0 : result
};

解题思路2:
利用双指针的做法,前面的步骤与思路1类似,都是转换为数组,之后判断数组长度是否是奇数,如果是,单独保存一下中间的数,然后把中间值从数组中剔除,之后设置左指针为数组第一项,右指针为数组最后一项,不断让两个指针指向的值进行交互,直到左指针不小于右指针为止。然后再在之前删除中间值的位置吧中间值加回去,再变回数字,剩下的步骤与思路1一致,不再赘述。

var reverse = function (x) {
    if (x === 0) return x
    let minus = false
    let arr = [];
    if (x < 0) {
        minus = true
        arr = (x * -1 + '').split('')
    } else {
        arr = (x + '').split('')
    }
    let result
    let middleIndex = -1,
        middle

    if (arr.length % 2 !== 0) {  // 说明长度是奇数
        middleIndex = Math.floor(arr.length / 2)  // 取中间值的index
        middle = arr[middleIndex] // 保存中间值
        arr.splice(middleIndex, 1)
    }
    let left = 0;
    let len = arr.length;
    let right = len - 1;
    while (left < right) {
        let temp = arr[right]
        arr[right] = arr[left]
        arr[left] = temp
        left++
        right--
    }
    if (middle) {
        arr.splice(middleIndex, 0, middle)  // 将中间值加回数组的中间位置
    }
    result = +arr.join('')
    if (minus) {
        result *= -1
    }
    return result > Math.pow(2, 31) || result < Math.pow(2, 31) * -1 ? 0 : result
}
  • 11
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值