LeetCode刷题第7题【整数反转】—解题思路及源码注释
结果预览
目录
- LeetCode刷题第7题【整数反转】---解题思路及源码注释
- 结果预览
- 一、题目描述
- 二、解题思路
- 1、问题理解
- 2、解题思路
- 三、代码实现及注释
- 1、源码实现
- 2、代码解释
- 四、执行效果
- 1、时间和空间复杂度分析
一、题目描述
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
提示:
-231 <= x <= 231 - 1
二、解题思路
1、问题理解
该问题的关键在于如何处理整数反转,并且避免在反转过程中超出 32 位整数的范围。
2、解题思路
- 问题分析
该问题的关键在于如何处理整数反转,并且避免在反转过程中超出 32 位整数的范围。具体的步骤如下:- 反转数字:通过取余和除法的方法提取数字的每一位,然后将其反转。
- 溢出处理:在反转过程中,我们需要检查是否超出了 32 位有符号整数的范围。
- 负数的处理:我们需要正确处理负数,反转时应保留负号。
- 步骤:
- 处理负数:如果输入的数字是负数,则反转后的结果应该保留负号。可以在反转完成后加上负号。
- 反转数字:利用取余和除法,我们可以从数字的末尾开始获取每一位,依次构建反转后的数字。
- 溢出判断:在反转过程中,如果结果超过了 2^31 - 1(即 2147483647)或小于 -2^31(即 -2147483648),则返回 0。
- 细节:
- 负数:处理负数时,可以先将其转换为正数进行处理,最后再加上负号。
- 溢出:反转时,我们需要判断反转的结果是否会超出 32 位整数的范围。在每次计算反转时,可以在放入新数字前判断是否会溢出。
三、代码实现及注释
1、源码实现
class Solution {
public:
int reverse(int x) {
int result = 0;
while (x != 0) {
int digit = x % 10; // 提取最后一位数字
x /= 10; // 去除最后一位数字
// 判断是否会溢出
if (result > INT_MAX / 10 || (result == INT_MAX / 10 && digit > 7)) {
return 0; // 超出正整数的范围
}
if (result < INT_MIN / 10 || (result == INT_MIN / 10 && digit < -8)) {
return 0; // 超出负整数的范围
}
result = result * 10 + digit; // 将数字加到反转结果的末尾
}
return result;
}
};
2、代码解释
- reverse 函数:
- 该函数的作用是反转给定的整数 x,并返回反转后的结果。
- while (x != 0):
- 我们在循环中处理每一位数字,直到 x 为 0。
- int digit = x % 10:
- 获取当前数字的最后一位。
- x /= 10:
- 去除数字的最后一位,准备处理下一位。
- 溢出判断:
- 判断是否会溢出:
- 如果 result 大于 INT_MAX / 10 或者 result 等于 INT_MAX / 10 且当前数字 digit 大于7,那么反转会超出正整数的范围。
- 如果 result 小于 INT_MIN / 10 或者 result 等于 INT_MIN / 10 且当前数字 digit 小于-8,那么反转会超出负整数的范围。
- 判断是否会溢出:
- result = result * 10 + digit:
- 将当前数字添加到 result 的末尾,形成反转后的结果。
- 返回结果:
- 当 x 为 0 时,退出循环并返回反转后的结果。
四、执行效果
1、时间和空间复杂度分析
- 时间复杂度:O(log(x)),其中 x 是整数的绝对值。每次通过取余操作去掉 x 的一位数字,因此需要 O(log(x)) 次操作。
- 空间复杂度:O(1),我们只使用了常数空间来存储 result 和 digit。