题目:给出一个 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;
    }
}

image.png

对于第一种方法,简单的说就是根据题目要求一步一步来,

  1. 判断是正数还是负数,如果是负数那么将其取反便于操作;
  2. 通过数学运算,即取余取整操作对其进行反转;
  3. 还原 原本的正负后根据题目要求判断是否超出。

对于第一种方法进行优化

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;
}

优化之后:
image.png

第二种解法

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;
}

image.png

第二种方法的思路是

将数字转换成数组(split),然后利用数组的方法进行相应的操作(reverse)之后拼接(join)成为字符串,最后隐式转换成为数字类型。

同样的最后要做是否溢出的判定。

End.


SANJIN
3 声望0 粉丝