# [7] 整数反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
这道题我们可以当做反转字符串的问题来解,即首尾双指针不断交换即可,在这里为了方便我直接使用了reverse函数。
接下来就是判断不合法的数字进行剔除了,合法数字应满足三点:
- 最前位不能为0
- 结果应在
INT
范围内 - 原符号需要保留
var reverse = function(x) {
const INT_MAX = Math.pow(2, 31) - 1;
const INT_MIN = Math.pow(-2, 31);
let res = Math.abs(x)
.toString()
.split('')
.reverse();
while (res[0] === '0') {
res.shift();
}
if (x < 0) {
res.unshift('-');
}
res = res.join('');
if (res < INT_MIN || res > INT_MAX) {
return 0;
}
return res;
};
当然,你也可以直接在数字类型里面直接反转,这里需要考虑的边界情况是,当数字的位数超过了INT
类型的范围,就要直接返回溢出,我们知道2^31-1的个位是7,-2^31的个位是-8,考虑到这一点就能AC。
因为JS是动态类型的语言,不区分整形和小数,所以用JS这样写还是十分繁琐的,不推荐。
var reverse = function(x) {
const INT_MAX = Math.pow(2, 31) - 1;
const INT_MIN = Math.pow(-2, 31);
let res = 0;
while(x !== 0) {
const remain = x % 10;
if(res > parseInt(INT_MAX / 10) || (res === parseInt(INT_MAX / 10) && remain > 7)) return 0;
if(res < parseInt(INT_MIN / 10) || (res === parseInt(INT_MIN / 10) && remain < -8)) return 0;
res = res * 10 + remain;
x = parseInt(x/10);
}
return res
};