LeetCode 7 Reverse Integer (Tag:Math Difficulty:Medium)

296 阅读2分钟

这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战

前言

关于 LeetCode 数组类型题目的相关解法,可见LeetCode 数组类型题目做前必看,分类别解法总结了题目,可以用来单项提高。觉得有帮助的话,记得多多点赞关注哦,感谢!

题目描述

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

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

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

示例 1:
输入:x = 123
输出:321

示例 2:
输入:x = -123
输出:-321

示例 3:
输入:x = 120
输出:21

示例 4:
输入:x = 0
输出:0

链接:leetcode-cn.com/problems/re…

题解

  1. 转换为字符串。首先我们可以先用一个标记来记录数字的正负,然后统一将数字转换为正数,方便后续处理。

    对于字符串的逆转,不管是转换为数组,利用数组内部的 reverse 函数,还是直接自己写 reverse 函数,都很方便处理。这里我才用了转换为数组,然后用数组的 reverse 函数逆转字符串,最后再转换为数字。

    当然题目中规定了转换后数字的范围,超出范围返回 0,需要额外判断一下。

    具体代码如下,时间复杂度 O(n)

/**
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {
    const flag = x >= 0 ? 1 : -1
    x = Math.abs(x)
    const x_list = String(x).split('')
    const new_x = Number(x_list.reverse().join('')) * flag
    if (new_x > Math.pow(2, 31) - 1 || new_x < -Math.pow(2, 31))  {
      return 0
    }
    return new_x 
};
  1. 利用余数。对于一个数字,我们每除以 10,余下的就是最末尾的位置上的数字,所以,我们每次都对数字先取余数,得到末尾数字,然后除以 10,得到整数部分,直到数字为 0。这样我们就能拿到每个数位上的值,然后依次乘上 10,就能得到逆转后的数字。

    具体代码如下,时间复杂度 O(n)。

/**
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {
    const flag = x >= 0 ? 1 : -1
    x = Math.abs(x)
  
    let ans = 0
    while (x != 0) {
      ans = ans * 10 + (x % 10)
      x = Math.floor(x / 10)
    }
    
    ans *= flag
    if (ans > Math.pow(2, 31) - 1 || ans < -Math.pow(2, 31))  {
      return 0
    }
    return ans
};