# 题目内容

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

# 解法一,我的解法

一开始看到题目,觉得这还不简单,一个reverse方法就能搞定的事。但细看后,也不尽然。因为只有数组类型直接reverse方法调用,而输入类型是Number。所以首先需要对输入进行处理,变为字符串再处理为数组形式。

按照题目要求,负号和0不参与翻转过程。可以简单地使用shift, unshiftpop处理完。

题目在最后还有一个要求是,假设环境只能存储下32位的有符号整数。给的数值范围是[-2^31, 2^31 -1],以为直接就是Js中Number类型的两个极值了(Number.Max_value Num.Min_value),但实际上不是。就直接接用他给的区间进行限定判断。一个小知识,JS中使用两个**来表示指数。

var reverse = function(x) {
    let toString =  `${x}`
    let toArr = toString.split('')
    let toArrCopy = toString.split('')
    if (toArr[0] === '-') {
        toArr.shift()
    }
    if (toArr[toArr.length -1 ] === '0') {
        toArr.pop()
    }
    toArr = toArr.reverse()
    if (toArrCopy[0] === '-'){
        toArr.unshift('-')
    }

    let finalValue = Number(toArr.join(''))

    if ((finalValue > 2**31-1) || (finalValue < -(2**31 - 1))) {
        return  0
    } else {
        return finalValue
    }
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

看了讨论区之后的一点改动,把2**31-1这种计算改为Math.pow(2, 31) - 1,~~发现时间复杂度大大降低,由击败35%变为击败95%。~~删除线部分是早先写好的,但后面进一步测试发现,改动前的代码时间复杂度也能够做到击败90%以上,但多次测试结果看,大概十分之一的概率达到。而改动后的算法虽然时间复杂度也不稳定,但平均击败率高于改动前。

# 解法二,大神解法

在讨论区看到的一种解法,初看的前几遍都看不懂。

var reverse = function(x) {
    var max = Math.pow(2, 31) - 1;
    var min = -Math.pow(2, 31);
    var y = 0;
    while(x !== 0) {
        y = 10 * y + x % 10;
        x = ~~(x/10);
    }
    if (y > max) return 0;
    if (y < min) return 0;
    return y;
};
1
2
3
4
5
6
7
8
9
10
11
12

该解法思路: 经过多次submit测试,发现这个解法时间复杂度也不稳定。空间复杂度较为稳定,能够保持击败90%多的击败率。

一笔写于: 5/24/2020, 4:34:20 PM
扫码添加我的微信
个人
个人号
公众号
公众号