题目:整数反转
leetcode链接:整数反转
说明:给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−2的31次方, 2的31次方 − 1] ,就返回 0。
理解:
1、有一个整数,需要得到反转后的值
2、该整数不能以0开头
3、保留整数的符号位
4、该整数反转后的值不能小于-2的31次方,也不能大于2的31次方-1
思路:
1、数字转字符串数组,然后利用双指针进行反转,之后再生成字符串,去掉开头的0,之后转数字再判断是否超过范围
2、记rev为翻转后的数字,为完成翻转,我们可以重复「弹出」x的末尾数字,将其「推入」rev的末尾,直至 x 为 0。
要在没有辅助栈或数组的帮助下「弹出」和「推入」数字,我们可以使用如下数学方法:
// 弹出 x 的末尾数字 digit
digit = x % 10
x /= 10
将数字 digit 推入 rev 末尾 rev = rev * 10 + digit
题解:
方案一:该方案存在各种类型转换,略显繁琐,效率也不高,尤其空间复杂点几乎到了历史最低点
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
let str = (x + '')
let arr = []
const len = str.length
for (let i = 0; i < len; i++) {
arr.push(str[i])
}
for (let left = 0, right = len - 1; left < right; ++left, --right) {
[arr[left], arr[right]] = [arr[right], arr[left]];
}
str = arr.join('').replace(/^0*/g, '')
if (x >= 0) {
const num = str * 1
return num > Math.pow(2, 31) - 1 ? 0 : num
} else {
str = str.slice(0, str.length - 1)
const num = -(str * 1)
return num < Math.pow(-2, 31) ? 0 : num
}
};
方案二:数学知识
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
let rev = 0;
while (x !== 0) {
const digit = x % 10;
x = ~~(x / 10);
rev = rev * 10 + digit;
if (rev < Math.pow(-2, 31) || rev > Math.pow(2, 31) - 1) {
return 0;
}
}
return rev;
};
总结:
本题方案一相对容易想出来,但是过程比较繁琐,方案二需要一定的数学知识并灵活运用,相对来说,可能不那么容易想到,但是代码简单,效率也相对高。