算法巩固练习之整数反转

71 阅读1分钟

整数反转

题目来源:7. 整数反转 - 力扣(LeetCode)

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。

示例 1:

输入: x = 123
输出: 321

示例 2:

输入: x = 120
输出: 21

提示:

  • -231 <= x <= 231 - 1

解题思路

感觉这题应该算归类为简单题,首先肯定是通过切割反转API来处理,然后处理临界值问题。后来实现后,觉得太粗暴了,然后又学了取余法

  1. 切割反转法
  2. 取余法

切割反转法解题代码

/**
 * @param {number} x
 * @return {number}
 */
var reverse = function (x) {
  const absResult = Math.abs(x);

  let result = absResult.toString().split("").reverse().join("");
  if (x < 0) {
    if (-result < -Math.pow(2, 31)) {
      result = 0;
    } else {
      result = -result;
    }

    return result;
  }

  if (result > Math.pow(2, 31) - 1) {
    return 0;
  }

  return result;
};

优化代码

/**
 * @param {number} x
 * @return {number}
 */
var reverse = function (x) {
  const absResult = Math.abs(x);

  let result = absResult.toString().split("").reverse().join("");

  if (x < 0) {
    result = -result;
  }

  result =
    result > Math.pow(2, 31) - 1 || result < -Math.pow(2, 31) ? 0 : result;

  return result;
};

取余法代码

/**
 * @param {number} x
 * @return {number}
 */
var reverse = function (x) {
  let absResult = Math.abs(x);

  let result = 0;
  while (absResult > 0) {
    // 每进一位就乘以10然后加上余数
    result = result * 10 + (absResult % 10);
    // 取余结束后,去掉一位
    absResult = Math.floor(absResult / 10);
  }

  if (x < 0) {
    result = -result;
  }

  result =
    result > Math.pow(2, 31) - 1 || result < -Math.pow(2, 31) ? 0 : result;
  return result;
};