版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/aaaaaaliang/article/details/89199104
题目描述
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
解决方案
方法:弹出和推入数字 & 溢出前进行检查
思路
我们可以一次构建反转整数的一位数字。在这样做的时候,我们可以预先检查向原整数附加另一位数字是否会导致溢出。
算法
反转整数的方法可以与反转字符串进行类比。
我们想重复“弹出” x 的最后一位数字,并将它“推入”到 rev 的后面。最后,rev 将与 x 相反。
要在没有辅助堆栈 / 数组的帮助下 “弹出” 和 “推入” 数字,我们可以使用数学方法。
//pop operation:
const pop = x % 10;
x = parseInt(x/10);
//push operation:
temp = rev * 10 + pop;
rev = temp;
上面溢出情况,其实指的是 Java int类型是32位整数,最小值-231 最大值 231-1
在JavaScript中 Number其实是64位浮点数,最小值-(253-1) 最大值253-1
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
let rev = 0;
let max = Math.pow(2,31)-1
let min = Math.pow(-2,31)
while (x!==0){
const pop = x % 10;
x = parseInt(x/10);
if(rev > max/10 || (rev===max/10 && pop>7)) return 0
if(rev < min/10 || (rev===min/10 && pop>-8)) return 0
rev = rev * 10 + pop
}
return rev
};
其他题解
摘自LeetCode如有侵权联系删除
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
var limt = Math.pow(2,31);
var mul = 1;
if( x < 0 ){
mul = -1;
x = x*mul;
}else{
limt -= 1;
}
var ret = 0;
while(x>0){
ret = ret * 10 + (x%10);
x = parseInt(x/10);
}
if( ret > limt ){
ret = 0;
}
ret =ret * mul;
return ret;
};
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
var max = Math.pow(2, 31) - 1
var min = -Math.pow(2, 31)
var res = 0
if (a > max || a < min) {
return 0
}
var a = parseInt(x) + ''
if (a.indexOf('-') !== -1) {
a = a.slice(1)
res = 0 - a.split('').reverse().join('')
} else {
res = a.split('').reverse().join('') - 0
}
return (res > max || res < min) ? 0 : res
};
```