# 整数反转

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

# 示例 1:

输入: 123
输出: 321

# 示例 2:

输入: -123
输出: -321

# 示例 3:

输入: 120
输出: 21

# 注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

# 分析

在js中,最大的整数安全数 Number.MAX_SAFE_INTEGER 为 253 - 1, 所以在这里我们需要手动设置环境安全数,借助 Math.pow

const INT_MAX  = Math.pow(2,31) - 1;  // 2147483647
const INT_MIN  = - Math.pow(2,31);

逐位进行分解和判断

while(x != 0){
    // 最低位数
    let pop = x%10;
    // 最高位数
    x =  parseInt(x/10);
    if(rev > INT_MAX / 10 || (rev == INT_MAX/10 && pop > 7 )) return 0;
    if (rev < INT_MIN /10 || (rev == INT_MIN /10 && pop < -8)) return 0;
    rev = rev * 10 + pop;
}

# 完整代码

var reverse = function(x) {
    let rev = 0
    const INT_MAX  =  parseInt((Math.pow(2,31) - 1)/10);  // 2147483647
    const INT_MIN  = - parseInt((Math.pow(2,31))/10);
    while(x!==0){
        let pop = x %10
        x = parseInt(x/10)
        if(rev > INT_MAX || (rev == INT_MAX && pop > 7)) return 0
        if(rev < INT_MIN || (rev == INT_MIN && pop<-8)) return 0
        rev = rev*10+pop
    }
    return rev
};

# 优化

借助位运算优化

var reverse = function(x) {
  let result = 0;
  while(x !== 0) {
      result = result * 10 + x % 10;
      x = (x / 10) | 0;
  }
  return (result | 0) === result ? result : 0;
};

按位操作符(Bitwise operators) 将其操作数(operands)当作32位的比特序列(由0和1组成), 详见mdn | (opens new window)