题目描述
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例
输入: 123
输出: 321
输入: -123
输出: -321
输入: 120
输出: 21
分析
环境的最大整数数值跟最小整数数值超过范围溢出 需要返回0 做处理
算法
在js中有一个数组的反转方法reverse v8中的具体实现看源码的时候看的我的表情就是这个样子🤤 真香我都看湿了。里面根据运行时判断执行那种方式去进行反转 写了三种反转方式 不同的方式效率不一样。 简单来说就是根据数组下标进行互换 同理我们也可以根据这样的方法进行反转整数,先将整数转字符串在操作字符串数组
const reverse = (n) => {
if (n < 0) {
n = n.toString().split('-')[1]; // 负数提取数字
n = '-' + [...n].reverse().join('');
n = +n; // 转数字
} else {
n = n.toString(); // 转字符
n = +[...n].reverse().join(''); // 转为数组 颠倒数组 再合字符 最后转数字
}
if (n >= Math.pow(2, 31) - 1 || n <= Math.pow(-2, 31) + 1) { // 判断溢出
return 0;
}
return n;
}
reverse(1234560) //654321
代码里的+[...n]部分利用了js的隐式转换将字符串类型转成数字类型,当然这种转来转去的方法太麻烦了我们可以用数学的方法来解决
var reverse = function (x) {
if (x === 0) return 0;
let result = 0;
while (x !== 0) {
result = result * 10 + x % 10;
x = parseInt(x / 10);
}
if (result >= 2147483647 || result <= -2147483647) {
return 0;
}
return result;
};
我们可以把整数想成栈的操作例如 要注意除10结果需要返回整数
推出
pop = x % 10;
x /= 10;
压入
temp = rev * 10 + pop;
rev = temp;
这样就完成了整数的反转
有更好的意见欢迎留言