整数反转

题目

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。

示例 1:

输入:x = 123
输出:321

示例 2:

输入:x = -123
输出:-321

示例 3:

输入:x = 120
输出:21

示例 4:

输出:0
输入:x = 0

解法一

解题思路

  • 先判断是不是负数
  • 将数字转成字符串,并将字符串翻转
  • 将翻转后的字符串转成数字。如果是负数,则转成负数。
  • 判断是否满足 [−2^31, 2^31 − 1] 这个条件,是的话返回数字,否则返回0
/**
 * @param {number} x
 * @return {number}
 */
function reverseByString (x: number): number {
  // 标记是否是负数
  const isNegative = x < 0
  // 翻转数字字符串
  const numberStr = (x + '').split('-').map((num:string) => {
    return num.split('').reverse().join('')
  }).join('')
  // 如果超出范围限制,返回0
  if (Number(numberStr) < Math.pow(-2, 31) || Number(numberStr) > Math.pow(2, 31) - 1) return 0
  // 如果是负数,则返回负数
  return isNegative ? 0 - Number(numberStr) : Number(numberStr)
}

解法二

解题思路

  • 循环处理,每次取出余数,将上一次循环的结果 * 10,再加上这个余数,同时将 x 的值除以10取整
  • x === 0 的时候,跳出循环
  • 判断是否满足 [−2^31, 2^31 − 1] 这个条件,是的话返回数字,否则返回0

举个 🌰 :

例如:123
第一次循环:0 * 10 + 3
第二次循环:3 * 10 + 2
第三次循环:32 * 10 + 1

注意

每次判断的时候需要 parseInt 一下,否则 x /= 10 之后是小数,循环会有问题。

/**
 * @param {number} x
 * @return {number}
 */
function reverse (x: number): number {
  let result = 0
  while (parseInt(`${x}`) !== 0) {
    result = result * 10 + parseInt(`${x}`) % 10
    x /= 10
  }
  // 如果超出范围限制,返回0
  if (result < Math.pow(-2, 31) || result > Math.pow(2, 31) - 1) return 0
  // 如果是负数,则返回负数
  return result
}
Last Updated:
Contributors: luhaifeng