题目:
给一个32位的有符号整数,范围[-2^31,2^31-1].对整数进行反转,考虑溢出和正负数问题,溢出返回0,正负不改变
第一种方法,数字=>字符串=>数组(反转)=>字符串=>数字
function reverseNum(num) {
const max = Math.pow(2, 31) - 1; //32 位最大整数
const min = Math.pow(-2, 31); // 32 位最小整数
const sign = Math.sign(num); // 获取数字正负的符号
num = Math.abs(num); // 取数的绝对值
let res = num.toString().split('').reverse().join(''); //转字符串,分割成数组,反转,转换成字符串
res = sign * parseInt(res); // 转为整数加上符号
if (res > max || res < min) {
//溢出判断
return 0;
} else {
return res;
}
}
console.log(reverseNum(-234)); //-432
console.log(typeof reverseNum(-234)) //number
第二种方法, 取余法
function reverseNum(num) {
const max = Math.pow(2, 31) - 1; //32 位最大整数
const min = Math.pow(-2, 31); // 32 位最小整数
const sign = Math.sign(num); // 获取数字正负的符号
num = Math.abs(num); // 取数的绝对值
let res = 0;
let remainder; // 余数
while (num > 0) {
remainder = num % 10;
num = (num - remainder) / 10;
res = res * 10 + remainder;
}
/*
num=-234 处理后循环操作的就是 234
第一轮 第二轮 第三轮 ...
remainder 234%10=4 23%10=3 2%10=2 num=0 不满足条件,结束循环
num (234-4)/10=23 (23-3)/10=2 (2-2)/10=0
res 0*10+4=4 4*10+3=43 43*10+2=432
*/
res *= sign;
if (res > max || res < min) {
//溢出判断
return 0;
} else {
return res;
}
}
console.log(reverseNum(-234)); //-432
console.log(typeof reverseNum(-234)) //number