掘金团队号上线,助你 Offer 临门! 点击 查看详情
一、题目描述:
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
二、思路分析:
- 依次对 x 的末位进行处理,即通过 x%10 取余获得个位数, 通过 x/10 替代现有 x,
- 位运算符:| ,两个位只要有一个为1,那么结果都为1,否则就为0
三、AC 代码
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
let result = 0;
while(x !== 0) {
result = result * 10 + x % 10;
x = (x / 10) | 0;
}
return (result | 0) === result ? result : 0;
};
执行用时:92 ms
内存消耗:39.2 MB
四、总结
- 当然不止一种方法,也看到很多方法实现,大概思路很类似;
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
let res = 0;
while(x){
res = res * 10 + x % 10;
if(res > Math.pow(2, 31) - 1 || res < Math.pow(-2, 31)) return 0;
x = ~~(x / 10); // 向下取整
}
return res;
};
执行用时:108 ms 内存消耗:39.3 MB
也看到有些使用字符串反转,再加判断
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
let sign = Math.sign(x)
let res = (Math.abs(x) + '').split('').reverse().join('') * sign
if (res > Math.pow(2, 31) - 1 || res < Math.pow(2, 31) * -1) res = 0
return res
};
仅供学习参考