给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
解释32 位的有符号整数即数值范围为 [−2^31, (2^31) − 1]之间
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, (2^31) − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-integer
解题思路一(普通解题,也是十分暴力)
-
先记录数值的正负
-
将数字转换成字符串
-
循环字符串判断,循环条件,从字符串尾部开始遍历
a. 条件1: 当前下标以及前一个下标的字符是否为0,
tempStr.charAt(i) === '0' && tempStr.charAt(i - 1) === '0'
b. 条件2: 所记录的反转过后的字符串是否存在 newStr.length === 0
c. 条件3: 传进来的数值最后一位是否为0
a,b,c 条件均成立,才能对当前字符0下标做标记 -
只要上面abc条件不满足,即可追加对应的字符
-
循环后判断是否在 [−2^31, (2^31) − 1] 区间内即可
代码如下
function reverse(x) {
if (typeof x !== 'number') {
return x
}
var tempStr = ''
var icon = '' // 先记录数值的正负
if (x >= 0) {
icon = "+"
tempStr = icon + x
} else {
icon = "-"
tempStr = x + ''
}
var newStr = '';
var oldStrLength = tempStr.length
var tempIndex = 0
var maxNumber = 2**31 - 1
var minNumber = (-2)**31
var newNumber = 0
for (var i = oldStrLength - 1; i >= 1; i--) {
if (oldStrLength === 1) {
newStr = tempStr
} else if (tempStr.charAt(i) === '0' && tempStr.charAt(i - 1) === '0' && tempStr.charAt(oldStrLength - 1) === '0' && newStr.length === 0) { // a b c 条件
tempIndex++
} else {
if (tempIndex > 0) {
if (!isNaN(tempStr.charAt(i - 1) * 1)) {
newStr += tempStr.charAt(i - 1) // 有0字符的时候,追加对应的字符
}
} else {
if (!isNaN(tempStr.charAt(i) * 1)) { // 无零字符,追加字符
newStr += tempStr.charAt(i)
}
}
}
}
if ((icon + newStr) * 1 > maxNumber || (icon + newStr) * 1 < minNumber) {
newNumber = 0
} else {
newNumber = (icon + newStr) * 1
}
return newNumber
}
解题思路二(完美版)
主要是运用了取余%符号,对数值尾数逐个提取,相当精简
- 记录正负值
- 根据正负值去数值的绝对值
- 循环传进来数值,使用while循环
a. 循环内使用%取余拿到数值尾数
b. 然后对已存储的反转后的数值进位在加上每次取出来的尾数
c. 取余后的数值因退位并向上取整,消除取余后的数值
d. 直至while条件x>0 - 最后对 [−2^31, (2^31) − 1] 区间内即可,以及记录的正负值取出最后正确的数值
主要使用了取余获取尾数,反转的数值进位,取值后的数值退位,如此将整数进行反转
代码如下
var reverse = function (x) {
const isNegative = x < 0
x = isNegative ? -x : x
let target = 0
while (x > 0) {
const y = x % 10 // 获取数字最后一位,可对10取余,
target = target * 10 + y // 由于每去一位末尾数字都是个位数,所以在追加数值时需进位
x = parseInt(x / 10) // 对已经取余的数字,退位至小数点,并取整
}
target = isNegative ? -target : target
let isOverflow = target < Math.pow(-2, 31) || target > Math.pow(2, 31) - 1
return isOverflow ? 0 : target
};