题目内容
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
解法一,我的解法
一开始看到题目,觉得这还不简单,一个reverse方法就能搞定的事。但细看后,也不尽然。因为只有数组类型直接reverse方法调用,而输入类型是Number。所以首先需要对输入进行处理,变为字符串再处理为数组形式。
按照题目要求,负号和0不参与翻转过程。可以简单地使用shift
, unshift
和pop
处理完。
题目在最后还有一个要求是,假设环境只能存储下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
}
};
看了讨论区之后的一点改动,把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;
};
该解法思路: 经过多次submit测试,发现这个解法时间复杂度也不稳定。空间复杂度较为稳定,能够保持击败90%多的击败率。