一、题目描述:
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
二、思路分析 之前做过一次这种题,取余然后放到一个新的变量里面然后用字符串拼接就行了
这种写法还能叫算法么
于是去题解找了其他简便方法
他的思路是这样的 首先取出x末位拼接到result中 然后再把x的末位去掉用 |0 强制转换为32位有符号整数,只移除小数点后的部分(这个我不知道) 然后最后result|0 来判断是否符合条件 符合条件转换后是等于本身的不等于就是溢出了直接返回0
快了不少
三、AC 代码:
1.取余(不断加判断的版本)
var reverse = function(x) {
if (x>(Math.pow(2, 31)-1)||x<-(Math.pow(2, 31))) {return 0}
if(x == 0) return 0
let up = true
if(x<0){
up = false
x = x*-1
}
let num= x/10;
let newNumber = '';
while(num>0){
let number = num.toString().split('.')[1]
if(number == undefined){
number = 0
}
newNumber+=number
num= parseInt(num)/10
}
if(!up){
newNumber = Number('-'+newNumber)
}
if (parseInt(newNumber)>(Math.pow(2, 31)-1)||parseInt(newNumber)<-(Math.pow(2, 31))) {return 0}
return parseInt(newNumber)
};
2.究极优化版
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;
};
四、总结:
|0 这个东西还是第一次用到,很巧妙,可以用于取整和范围判断
本文正在参与「掘金 2021 春招闯关活动」, 点击查看活动详情