# 整数反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
# 示例 1:
输入: 123
输出: 321
# 示例 2:
输入: -123
输出: -321
# 示例 3:
输入: 120
输出: 21
# 注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
# 分析
在js中,最大的整数安全数 Number.MAX_SAFE_INTEGER
为 253 - 1, 所以在这里我们需要手动设置环境安全数,借助 Math.pow
const INT_MAX = Math.pow(2,31) - 1; // 2147483647
const INT_MIN = - Math.pow(2,31);
逐位进行分解和判断
while(x != 0){
// 最低位数
let pop = x%10;
// 最高位数
x = parseInt(x/10);
if(rev > INT_MAX / 10 || (rev == INT_MAX/10 && pop > 7 )) return 0;
if (rev < INT_MIN /10 || (rev == INT_MIN /10 && pop < -8)) return 0;
rev = rev * 10 + pop;
}
# 完整代码
var reverse = function(x) {
let rev = 0
const INT_MAX = parseInt((Math.pow(2,31) - 1)/10); // 2147483647
const INT_MIN = - parseInt((Math.pow(2,31))/10);
while(x!==0){
let pop = x %10
x = parseInt(x/10)
if(rev > INT_MAX || (rev == INT_MAX && pop > 7)) return 0
if(rev < INT_MIN || (rev == INT_MIN && pop<-8)) return 0
rev = rev*10+pop
}
return rev
};
# 优化
借助位运算优化
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;
};
按位操作符(Bitwise operators) 将其操作数(operands)当作32位的比特序列(由0和1组成), 详见mdn | (opens new window)