LeetCode7、 整数反转

92 阅读2分钟

LeetCode 系列记录我学习算法的过程。

持续创作,加速成长!这是我参与「掘金日新计划 6 月更文挑战」的第 7 天,点击查看活动详情

题目

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

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

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

示例:

输入: x = 123
输出: 321

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

输入: x = 120
输出: 21

输入: x = 0
输出: 0

提示

  • 231-2^{31} <= x <= 2312^{31} - 1

思路

这个题目我的思路就是将数组变成去掉符号的字符串

然后将字符串进行切割 反转数组 再组合成字符串并拼接上符号

最后转成数字,判断是否在 指定范围内,将结果返回

代码实现

/**
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {
    // 如果 x 只有一位数,直接返回自身
    if (x > -10 && x < 10) return x
    // 记录符号
    let symbol = x > 0 ? '' : '-'
    // 将 x 转成字符串 然后切割 反转 合并 再与符号组合
    let str = symbol + (String(Math.abs(x)).split('').reverse().join(''))
    // 将上面得到的反转字符串转为数字
    let num = Number(str)
    // 判断大小 返回 0 或自身
    return (num < Math.pow(-2, 31) || num > (Math.pow(2, 31) - 1)) ? 0 : num
};

image.png 完美运行通过~

优化

这题我确实没想到有其他啥更好的方法,只能再看看别人是怎么实现的

果然有人的解法是我完全没想到且乍一看还看不懂的那种,使用了按位或 | 来进行保留符号取整:

  • result * 10 + x % 10 取出末位 x % 10(负数结果还是负数,无需关心正负),拼接到 result 中。
  • x / 10 去除末位,| 0 强制转换为 32 位有符号整数。
  • 通过 | 0 取整,无论正负,只移除小数点部分(正数向下取整,负数向上取整)。
  • result | 0 超过 32 位的整数转换结果不等于自身,可用作溢出判断。
/**
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {
    // 记录结果
    let result = 0
    while(x !== 0) {
        // 将 x 的个位拼到 result 的个位上
        result = result * 10 + x % 10
        // 去掉 x 的个位 及 小数
        x = (x / 10) | 0
    }
    // 通过  | 0  操作可以判断结果是否在 指定范围内
    return (result | 0) === result ? result : 0
};

image.png