问题链接: leetcode-cn.com/problems/re…
所用技巧:Number
// 给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
// 如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1] ,就返回 0。
// 假设环境不允许存储 64 位整数(有符号或无符号)。
读题审题
- 输出的数据是有范围的[-231,231-1]
- 输入的数据是有符号的
暴力解法
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
let revNum = ''
for(const i of `${Math.abs(x)}`){
revNum = i + revNum
}
if(revNum < Math.pow(-2,31) || revNum > Math.pow(2,31) -1){
return 0
}
return x > 0 ? revNum * 1 : revNum * -1
};
- 时间复杂度O(n)
- 执行用时: 80 ms
- 内存消耗: 39.4 MB
解法说明
- 将数字的绝对值转换成一个字符串,循环这个字符串
- 循环过程中,将前一个item加到下一个字符串的后面
- 将循环后的字符串转换成数字,注意正负数和数字的范围
暴力解法二
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
let num = 0
while(x !== 0){
const i = x % 10
x = ~~(x/10)
num = num*10+i
}
if(num < Math.pow(-2,31) || num > Math.pow(2,31) -1){
return 0
}
return num
};
- 时间复杂度O(n)
- 执行用时: 80 ms
- 内存消耗: 39.2 MB
解法说明
- 每次都要拿到这个数字的末尾数字
- 再将这个数字按照顺序给拼接起来得到一个最终结果
- 需要判断得到的值的范围