# 7. 整数反转

# 题目

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

TIP

示例  1:

输入: 123 输出: 321

示例 2:

输入: -123 输出: -321

示例 3:

输入: 120 输出: 21

注意:

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

# 题解

# 直接翻转

/**
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {
  let min = Math.pow(-2, 31),
    max = Math.pow(2, 31) - 1;
  let sign = x > 0 ? 1 : -1;

  let s = sign > 0 ? x + "" : x * -1 + "";
  let r = Number(
    s
      .split("")
      .reverse()
      .join("")
  );
  if (r > max || r < min) return 0;
  return r * sign;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

#

对原数不断取模除 10 从低往高得到每一位,同时加上每一位乘 10,得到反转后的数,同时判断是否越界

/**
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {
  let min = ~~(Math.pow(-2, 31) / 10),
    max = ~~((Math.pow(2, 31) - 1) / 10),
    maxmod = (Math.pow(2, 31) - 1) % 10,
    minmod = Math.pow(-2, 31) % 10;
  let r = 0;
  while (x) {
    // pop
    let pop = x % 10;
    x = ~~(x / 10);
    if (r > max || (r == max && pop > maxmod)) return 0;
    if (r < min || (r == min && pop < minmod)) return 0;

    // push
    r = r * 10 + pop;
  }
  return r;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22