前端算法(7)

95 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

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

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

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

输入: x = 123
输出: 321

解题思路

思路一

我们先进行判断若输入整数x是大于0的,则先把整数x转换为字符串,再分割成字符串数组, 然后进入for循环,依次往数组s中添加t中的末尾元素,添加完毕后,把数组转换为字符串,然后转换为数字,如果此时s的值大于2的31次方减一,就返回0,否则返回s,若输入整数x是小于0的,则步骤相同,只不过初始数组s中有初值 '-',最后使用三目运算符,若s小于-2的31次方,则返回0,否则返回s

var reverse = function(x) {
    if (x >= 0) {
        let t = x.toString().split('');
        let n = t.length;
        let s = []
        for (let j = n - 1; j >= 0; j--) {
            s.push(t[j])
        }
        s = s.join('')
        s = Number(s)
        return s>(Math.pow(2,31)-1)? 0 : s
    }
    else {
        let t = x.toString().split('');
        let n = t.length;
        let s = ['-']
        for (let j = n - 1; j >0; j--) {
            s.push(t[j])
        }
        s = s.join('')
        s = Number(s)
        return s<Math.pow(-2,31)? 0 : s
    }
};

思路二

我们可以通过Math.abs(x)取x的绝对值,判断x是否为负数,是则提取x的符号,得到反转后的数组,对[1]所得数字split成数组,再reverse反转,用join处理[3]所得数组, 得到结果后将[2]与[4]转为数字, 判断数字是否符合,是则返回[5],否则返回 0

var reverse = function(x) {
    var prefix = '';
    var absX = Math.abs(x);
    if (x < 0) {
        prefix = '-';
    }
    var arr = String(absX).split('');
    var reverseArr = arr.reverse();
    var reverseStr = reverseArr.join('');
    const result =  Number(prefix + reverseStr);
    if (result < Math.pow(-2, 31) || result > (Math.pow(2, 31) - 1)) {
        return 0;
    } else {
        return result;
    }
};