7.整数反转

题目

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

示例 1:

输入: 123
输出: 321

示例 2:

输入: -123
输出: -321

示例 3:

输入: 120
输出: 21

注意:

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

一. 字符串翻转

先将数字转换为字符串,再将字符串翻转之后转换为数字,并考虑边界即可。

js实现

/**
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {
  var plus = true
  if (x < 0) {
    plus = false
    x = -x
  }
  // 翻转字符串
  var s = x.toString()
  var sList = s.split('')
  sList.reverse()
  s = sList.join('')
  // 去除头部的`0`
  s.replace(/\b(0+)/gi,"")
  // 判断是否溢出
  if (plus) {
    if (s.length > 10 || s.length === 10 && s > "2147483647") {
      return 0
    }
  } else {
    if (s.length > 10 || s.length === 10 && s > "2147483648") {
      return 0
    }
  }
  if (plus) {
    return Number(s)
  }
  else {
    return -Number(s)
  }
};

复杂度分析

时间复杂度:O(n)
空间复杂度:O(n)

测试结果

✔ Accepted
  ✔ 1032/1032 cases passed (84 ms)
  ✔ Your runtime beats 95.02 % of javascript submissions
  ✔ Your memory usage beats 51.91 % of javascript submissions (35.7 MB)

二. 直接使用数字进行翻转

取输入数字的个位,将结果乘十后再加上这个数再作为结果,知道输入数字为0,返回结果即可。

js实现

/**
 * @param {number} x
 * @return {number}
 */
var reverse = function (x) {
  var answer = 0
  var plus = true
  if (x < 0) {
    plus = false
    x = -x
  }
  while (x > 9) {
    var remain = x % 10
    x = (x - remain) / 10
    answer = answer * 10 + remain
  }
  if (plus) {
    if (2147483647 - x < answer * 10) {
      return 0
    } else {
      return answer * 10 + x
    }
  } else {
    if (2147483648 - x < answer * 10) {
      return 0
    } else {
      return - (answer * 10 + x)
    }
  }
};

复杂度分析

时间复杂度:O(n)
空间复杂度:O(1)

测试结果

✔ Accepted
  ✔ 1032/1032 cases passed (80 ms)
  ✔ Your runtime beats 98.54 % of javascript submissions
  ✔ Your memory usage beats 88.03 % of javascript submissions (35.5 MB)

你可能感兴趣的:(LeetCode题解)