# 题目描述

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

示例一🌰:

输入: 123
输出: 321

示例二🌰:

输入: -123
输出: -321

示例三🌰:

输入: 1200
输出: 21

注意⚠️

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

# 解题思路

解法一

将输入的数转换为数组, 然后利用数组的reverse()方法反转,之后在判断反转后数的大小.

  1. 考虑输入的数为0, 或者小于10的情况;
  2. 若是输入的数为负数,则注意要将-号取出再进行反转;
  3. 反转完之后记得去除反转后的数前面有0的项;
  4. 反转完之后记得要将负号添加回去;
  5. 可以利用Math.pow()来进行数的判断.

解法二

将输入的数从尾部开始向头部移.

  1. 利用x % 10来获取一串数字中的个位数;
  2. 利用parseInt(x / 10)来获取一串数字中除了个位数的其它位数;

# Coding

解法一

/**
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {
    if (!x) return 0;
    x += '' // 将数字转为字符串
    let array = x.split('')
    let isNegative = false // 是否为负数
    if (array.length === 1) return Number(array.join(''))
    if (array[0] === '-') { // 或者 x < 0
        isNegative = true
        array.shift() // 去掉'-'号
    }
    array = array.reverse()
    while (array[0] === '0') { // 去除反转后前面的0
        array.shift()
    }
    if (isNegative) array.unshift('-')
    x = Number(array.join(''))
    if (x >= Math.pow(-2, 31) && x <= Math.pow(2, 31) - 1) {
        return x
    } else {
        return 0
    }
};

执行用时88 ms,内存消耗35.8MB

解法二

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

  let isNegative = x < 0
  if (isNegative) {
    x = -x
  }
  let a = 0
  while (x > 9) {
    a = a * 10 + x % 10 * 10
    x = parseInt(x / 10)
  }
  a += x

  return isNegative ? overflow(-a) : overflow(a)
};

执行用时88 ms,内存消耗35.4MB

测试代码

reverse(120)
// 21
reverse(248392835803854735943854)
// 0
阅读全文