数据结构与算法之整数反转

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

注意:

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

示例

输入: 123
输出: 321

输入: -123
输出: -321

输入: 120
输出: 21

分析

无论是大于或小于0, 我们都先转换为大于0, 然后进行取余取整,最后根据原数是大于0或小于0进行还原. 举例: x = 120, 我们假设最后输出的值result = 0, 先进行取余result * 10 + x % 10 = 0, result = 0, 为了反转数字我们需要取整x = 120 / 10 = 12, 接着取余result等于0 * 10 + 12 % 10 = 2, 接着继续取整x = 12 / 10 = 1, 取余result等于2 * 10 + 1 % 10 = 21, 继续取整1 / 10小于0退出判断, 根据原数x和result是否在边界内得到反转后的数

代码

Python3(导入Math模块)

def reveserIntNumber(self, x):
  num = Math.abs(x)
  now = 0

  while num > 0:
    // now取余
    now = now * 10 + num % 10
    // num取整
    num = Math.floor(num / 10)

  // 如果原来x > 0并且 x < 2^31  则为now
  // 如果原来x < 0并且 x < 2^31  则为-now
  if x < 0:
    return now if now <= Math.pow(2, 31) else 0
  else:
    return -now if now < Math.pow(2, 31) else 0 

Python3(转字符串)

def reveserIntNumber(self, x):
  s = str(x)
  if s[0] == '-':
    x = int('-' + s[1:][::-1])
  else:
    x = int(s[::-1])
  return x if -2147483648< x <2147483647 else 0

JavaScript

function reveserIntNumber(x) {
  // 转换为整数
  let num = Math.abs(x)
  let now = 0

  while (num > 0) {
    // 0 * 10 + 123 % 10 = 0 + 3 = 3
    // 3 * 10 + 12 % 10 = 30 + 2 = 32
    // 32 * 10 + 1 % 10 = 32 + 1 = 321

    // 0 * 10 + 120 % 10 = 0
    // 0 * 10 + 12 % 10 = 2
    // 2 * 10 + 1 % 10 = 21
    now = now * 10 + num % 10
    // 123 / 10 = 12
    // 12 / 10 = 1
    // 1 / 10 = 0
    num = Math.floor(num / 10)
  }

  if (x < 0) {
    return now <= Math.pow(2, 31) ? -now : 0
  } else {
    return now < Math.pow(2, 31) ? now : 0 
  }
}