题目:给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
第一种方法
var reverse = function(num){
var flag = num > 0,
newValue = 0;
if (!flag) {
num = -num;
}
while (num > 9) {
newValue = newValue * 10 + num % 10 * 10;
num = Math.floor(num / 10);
}
newValue += num;
if (!flag) {
newValue = -newValue;
}
if (newValue > Math.pow(2, 31) - 1 || newValue < Math.pow(2, 31) * -1) {
return 0;
} else {
return newValue;
}
}
对于第一种方法,简单的说就是根据题目要求一步一步来,
- 判断是正数还是负数,如果是负数那么将其取反便于操作;
- 通过数学运算,即取余取整操作对其进行反转;
- 还原 原本的正负后根据题目要求判断是否超出。
对于第一种方法进行优化
var reverse = function(num){
var flag = num > 0,
newValue = 0;
!flag && (num = -num);
while (num > 0) {
newValue = newValue * 10 + num % 10;
num = Math.floor(num / 10);
}
!flag && (newValue = -newValue);
return (newValue > Math.pow(2, 31) - 1 || newValue < Math.pow(2, 31) * -1) ?
0 :
newValue;
}
优化之后:
第二种解法
function reverse(num) {
var reverseNum = (Math.abs(num) + '').split('').reverse().join('');
return (reverseNum > Math.pow(2, 31) - 1 || reverseNum < Math.pow(2, 31)*-1) ?
0 :
num > 0 ? reverseNum : -reverseNum;
}
第二种方法的思路是
将数字转换成数组(split),然后利用数组的方法进行相应的操作(reverse)之后拼接(join)成为字符串,最后隐式转换成为数字类型。
同样的最后要做是否溢出的判定。
End.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。