记录个人算法学习7:整数反转

72 阅读1分钟

问题描述

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

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

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

示例 1:

输入: x = 123
输出: 321

示例 2:

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

示例 3:

输入: x = 120
输出: 21

示例 4:

输入: x = 0
输出: 0

 

提示:

  • -231 <= x <= 231 - 1

解题思路

这个问题其实也是个for循环的问题,好多前端人,包括我自己下意识会想要用js的某些语法去处理,比如说用js的reverse语法

let reversed = parseInt(x.toString().split('').reverse().join(''))

这个思维定式一定要改回来,转数组再转换回来,这个语法本身的时间复杂度就很高,所以最好用原生的js的for循环语法,数字反转的话应该要想到在循环中一步步的除以10,然后处理结果和余数

代码实现

function reverseInteger(x) {
  const INT_MAX = 2**31 - 1;
  const INT_MIN = -2**31;

  let result = 0;
  while (x !== 0) {
    // 取出x的最后一个数字
    let digit = x % 10;
    // 将结果乘以10并加上最后一个数字
    result = result * 10 + digit;
    // 移除x的最后一个数字
    x = Math.trunc(x / 10); // 取整
  }

  // 检查结果是否在32位有符号整数的范围内
  if (result > INT_MAX || result < INT_MIN) {
    return 0;
  }

  return result;
}