Skip to content

7. 整数反转

原文题目

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

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

https://leetcode.cn/problems/reverse-integer/description/

题目分析

例如输出的整数 x = 123,那么反转之后的结果就是 321。若输入的整数为 x = -123,那么反转之后的结果就是 -321。这道题目还是比较容易理解的。

题解思路

方式一:字符串反序

最简单的方式就是将其转为字符串,从尾部往头部开始遍历,将该元素添加到新字符串中。但是代码量和运算次数相对会多一些。

时间复杂度:O(n)

空间复杂度:O(1)

js
const reverse = function (x) {
    const lessZero = x > 0
    const str = String(Math.abs(x))
    let str2 = ''

    for (let index = str.length - 1; index >= 0; index--) {
        const item = str[index]

        str2 += item
    }

    const res = lessZero > 0 ? Number(str2) : Number(-str2)
    return (res | 0) === res ? res : 0
}

reverse(-123) // -321
代码分析
  1. 通过 lessZero = x > 0 记录当前是正数、还是负数,如果是负数,在输出的时候就补上负号。

  2. 将整数 x 转为字符串,并且保证后续都使用正数作为运算 Math.abs(x)

  3. 通过 for 循环将字符串 str = 123 反转为 321

  4. const res = lessZero > 0 ? Number(str2) : Number(-str2) 代码主要为输出的字符串结果补上负号,并转为整数。

  5. (res | 0) 表示进行位运算,如果超出 32 位,则会改变 res 的值。

  6. (res | 0) === res ? res : 0 如果位运算后,值被改变了,则代表超出 32 位,则返回 0

方式二:通过位运算和余数反转

通过余数可以轻而易举的获得整数 x 的末尾位数,例如

123 % 10 = 3

12 % 10 = 2

1 % 10 = 1

最后再将其进行存储和运算,即可满足题目要求。

时间复杂度:O(n)

空间复杂度:O(1)

js
const reverse = function (x) {
    let result = 0
    while (x !== 0) {
        result = result * 10 + (x % 10)
        x = (x / 10) | 0
    }

    return (result | 0) === result ? result : 0
}

reverse(-123) // -321
思路分析
  1. 遍历整数 123,分别得出 3 2 1
  1. 3 2 1 进行位数相乘,并存储到新的整数中。
  1. 输出最终结果 321

更新时间: