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+ | 🟠 | 🀄️ 🔗 |
