一、题目描述

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

注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [-2147483647, 2147483647]

请根据这个假设,如果反转后整数溢出那么就返回 0。

二、示例

示例 1

  • 输入: 123
  • 输出: 321

示例 2

  • 输入: -123
  • 输出: -321

示例 3

  • 输入: 120
  • 输出: 21

三、构造输入输出

需要注意的是,翻转的时候 - 是需要提到前面的,并不是在后面

如果存在 00000 这么多 0 在前面,需要去掉最前面的 0

最后需要比较大小防止溢出。

  • let str = '120';
  • str = '-1000002';
  • str = '-100000';
  • str = '00000';
  • str = '1534236469';
  • console.log(reverse(str));

四、JavaScript 解题

这个题还是很简单,不过比较 hack 的就是,本质上,javascript 只有 number 的类型,因此无论如何,我可以直接比较 2147483647-2147483647 的大小。

如果按照正规的解法,应该比较两个字符串或者是数组的解法才对。

/**
 * @param {number} x
 * @return {number}
 */
var reverse = function (x) {
    return getResult(x);
};

function getResult(x) {
    const arr = x.toString().split('').reverse(); // 数组反转
    let res = '';
    let start = 0;
    let len = arr.length;
    if (arr[len - 1] === '-') { // 如果反转之后最后一个是 - 则把 - 提到最前面
        res = arr[len - 1];
        len = len-1; // 长度 -1
    };
    let hasNoZero = false; // 判断是否还是存在 0
    for (let i = start; i < len; i++) { 
        if (arr[i] !== '0') hasNoZero = true; // 从第一个开始遍历,如果不存在 0 则可以拼接字符串
        if (hasNoZero) res += arr[i];
    }
    // 大小判断
    if(!res || res > 2147483647 || res < -2147483647) return '0';
    return res;
}

比较两个字符串的大小,判断是否溢出,而不是直接比较数字。

1.png