7. 整数反转
7. 整数反转
题目
Given a signed 32-bit integer x
, return x
with its digits reversed. If reversing x
causes the value to go outside the signed 32-bit integer range [-2^31, 2^31 - 1]
, then return 0
.
Assume the environment does not allow you to store 64-bit integers (signed or unsigned).
Example 1:
Input: x = 123
Output: 321
Example 2:
Input: x = -123
Output: -321
Example 3:
Input: x = 120
Output: 21
Constraints:
-2^31 <= x <= 2^31 - 1
题目大意
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]
。请根据这个假设,如果反转后整数溢出那么就返回 0。
解题思路
符号处理:
- 首先检查
x
是否为负数。通过isNegative
变量记录符号,后续反转操作时只需要处理正整数部分。 - 如果
x
为负数,反转后的结果应该保持负号,反之为正数。
- 首先检查
反转操作:
- 对
x
进行逐位反转:每次取x
的最后一位(x % 10)
,将其加到temp
(反转后的结果)上,然后将x
除以 10。 - 通过
Math.floor(x / 10)
来去除x
的最后一位。
- 对
溢出检测:
- 在每次更新
temp
后,立即检查temp
是否超出了 32 位有符号整数的范围。如果超出范围,则返回 0。 - 32 位有符号整数的范围是
[-2^31, 2^31 - 1]
,即-2147483648
到2147483647
。
- 在每次更新
最终返回值:
- 在反转完成后,乘以原始整数的符号
isNegative
来恢复原始符号,返回结果。
- 在反转完成后,乘以原始整数的符号
复杂度分析
- 时间复杂度:
O(log(x))
,其中x
是输入的整数。每次通过除以 10 来去掉一位数字,所以时间复杂度是对x
的位数的对数级别。 - 空间复杂度:
O(1)
,只使用了常数空间来存储变量。
代码
/**
* @param {number} x
* @return {number}
*/
var reverse = function (x) {
// 判断是否为负数
const isNegative = x < 0 ? -1 : 1;
// 将负数转为正数进行处理
let temp = 0;
x *= isNegative;
// 反转数字
while (x > 0) {
temp = temp * 10 + (x % 10); // 将最后一位加到 temp
x = Math.floor(x / 10); // 去掉最后一位
// 检查是否溢出
if (temp < -(2 ** 31) || temp > 2 ** 31 - 1) return 0;
}
// 恢复符号并返回结果
return temp * isNegative;
};
相关题目
题号 | 标题 | 题解 | 标签 | 难度 | 力扣 |
---|---|---|---|---|---|
8 | 字符串转换整数 (atoi) | [✓] | 字符串 | 🟠 | 🀄️ 🔗 |
190 | 颠倒二进制位 | [✓] | 位运算 分治 | 🟢 | 🀄️ 🔗 |
2119 | 反转两次的数字 | [✓] | 数学 | 🟢 | 🀄️ 🔗 |
2442 | 反转之后不同整数的数目 | 数组 哈希表 数学 1+ | 🟠 | 🀄️ 🔗 |