Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
菜鸟就要从第19题继续
一、题目描述:
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
输入:x = 123 输出:321 示例 2:
输入:x = -123 输出:-321 示例 3:
输入:x = 120 输出:21 示例 4:
输入:x = 0 输出:0
提示:-231 <= x <= 231 - 1
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/re… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
第一版:这道题如果不考虑范围限制,则只要依次对各个位数进行翻转即可,因此采用求余的方式进行循环判断。并注意正负的影响。但这里对正负的考虑其实是不必要的。使用Math.pow()进行幂运算
第二版:参考官方解答,注意到求余操作,对于负数也是同样直接成立的,判断条件改为!==0即可。注意这里取整的方式使用~~去掉小数部分
- ~是按位取反运算,
- ~~是取反两次
三、AC 代码:
1、第一版
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
let symbol = 0
let result = 0
if(x<0){
symbol=1
x=-x
}
while(x>0){
temp =x %10
result= result*10+temp
x=(x-temp)/10
}
result = Math.pow(-1,symbol)*result
if (result < Math.pow(-2, 31) || result > Math.pow(2, 31) - 1) {
return 0;
}
return result
};
2、第二版
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
let rev = 0;
while (x !== 0) {
const digit = x % 10;
x = ~~(x / 10);
rev = rev * 10 + digit;
if (rev < Math.pow(-2, 31) || rev > Math.pow(2, 31) - 1) {
return 0;
}
}
return rev;
};