7.
整数反转
原文题目
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围,就返回 0。
题目分析
例如输出的整数 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
代码分析
通过
lessZero = x > 0
记录当前是正数、还是负数,如果是负数,在输出的时候就补上负号。将整数
x
转为字符串,并且保证后续都使用正数作为运算Math.abs(x)
通过
for
循环将字符串str = 123
反转为321
const res = lessZero > 0 ? Number(str2) : Number(-str2)
代码主要为输出的字符串结果补上负号,并转为整数。(res | 0)
表示进行位运算,如果超出32
位,则会改变res
的值。(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
思路分析
- 遍历整数
123
,分别得出3 2 1
- 将
3 2 1
进行位数相乘,并存储到新的整数中。
- 输出最终结果
321