# [7] 整数反转

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

示例 1:

输入: 123

输出: 321

示例 2:

输入: -123

输出: -321

示例 3:

输入: 120

输出: 21

注意:

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

这道题我们可以当做反转字符串的问题来解,即首尾双指针不断交换即可,在这里为了方便我直接使用了reverse函数。

接下来就是判断不合法的数字进行剔除了,合法数字应满足三点:

  1. 最前位不能为0
  2. 结果应在INT范围内
  3. 原符号需要保留
var reverse = function(x) {
  const INT_MAX = Math.pow(2, 31) - 1;
  const INT_MIN = Math.pow(-2, 31);
  let res = Math.abs(x)
    .toString()
    .split('')
    .reverse();

  while (res[0] === '0') {
    res.shift();
  }

  if (x < 0) {
    res.unshift('-');
  }
  res = res.join('');
  if (res < INT_MIN || res > INT_MAX) {
    return 0;
  }
  return res;
};

当然,你也可以直接在数字类型里面直接反转,这里需要考虑的边界情况是,当数字的位数超过了INT类型的范围,就要直接返回溢出,我们知道2^31-1的个位是7,-2^31的个位是-8,考虑到这一点就能AC。

因为JS是动态类型的语言,不区分整形和小数,所以用JS这样写还是十分繁琐的,不推荐。

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