题意
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例
输入: 23 // 输出: 321
输入: -123 // 输出: -321
输入: 120 // 输出: 21
注意
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
需要注意一下两点:
1、类似1000这种数字,反转了之后不是0001,而是1
2、32位interger的取值范围
思路
这一题也可以有两种思路:
-
字符串法:把数字转成字符串,每个元素储存一个数位,然后反转字符串元素顺序,最后把字符串转成数字,js里字符串的操作还是很方便的,这时需要考虑上面注意的两点。
-
模十法:初始化一个result = 0,把给定的数字n除以十,得到余数作为最低位,商作为新的数字n,result = result + 余数*10,这样每次得到的最低位就会随着循环不断提升数位,从而得到逆序的result。
JavaScript的解法
字符串法:
var reverse = function (x) {
if( x > Math.pow(2,31)-1 || x < Math.pow(-2, 31)){
return 0;
}
let flag = true;
if (x < 0) {
flag = false;
}
let currentVal = Math.abs(x).toString();
let result = "";
for (let i = 0; i < currentVal.length; i++) {
result += currentVal.charAt(currentVal.length - 1 - i);
}
/***或者这样写
for (let i = currentVal.length-1; i >= 0; i--) {
result += currentVal[i];
}
*/
if (!flag) {
result = '-' + result;
}
if( result > Math.pow(2,31)-1 || !flag && result < Math.pow(-2, 31)){
return 0;
}
return result
};
模十法:
var reverse = function(x) {
var y = Math.abs(x);
var result = 0;
while(y > 0){
result = result * 10 + y % 10;
y = parseInt(y / 10);
}
result = x < 0 ? -result : result;
return result >= -Math.pow(2,31) && result <= Math.pow(2,31) - 1 ? result : 0;
};
好激动,要出结果啦
字符串法也能解决问题,但是对数字的处理从数位的角度去思考问题也许可以会让人眼前一亮!
恭喜你,又掌握了一个新技能~
喜欢就点个关注吧~❤️
公众号【前端FE】
有任何问题都可以给我留言哦~
网友评论