题目描述
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
解题思路
使用数学运算来逐个反转整数的每一位。这种方法可以在反转的过程中直接判断并处理整数溢出的情况。
具体步骤是,每次取出整数的最后一位(可以通过对 10 取余得到),然后将其加到反转后的整数上(注意要乘以 10,因为每次循环都在处理更高一位的数字)。同时,为了避免溢出,需要在每次加法操作之前检查反转后的整数是否超过了 32 位有符号整数的范围。
var reverse = function(x) {
let reversed = 0;
let INT_MIN = -Math.pow(2, 31);
let INT_MAX = Math.pow(2, 31) - 1;
// 处理特殊情况:当x为INT_MIN时,直接返回0
if (x === INT_MIN) {
return 0;
}
while (x !== 0) {
let pop = x % 10;
// 计算反转后的下一个值
let next = reversed * 10 + pop;
// 检查是否溢出
// 注意:我们需要同时检查正数和负数溢出的情况
if (next > INT_MAX || next < INT_MIN) {
return 0;
}
// 更新反转数
reversed = next;
// 移除x的最后一位数字
x = Math.trunc(x / 10);
}
return reversed;
};