题目:
力扣第七题是“整数反转”(Reverse Integer)。题目要求我们给定一个 32 位有符号整数,反转其数字。如果反转后的整数超过了 32 位有符号整数的范围 [-2^31, 2^31 - 1],则返回 0。
解题思路:
-
处理正负号:
- 我们首先需要记录输入整数的符号,如果是负数,则最终结果也应该是负数。
-
逐位反转数字:
- 将整数的每一位提取出来,然后构建反转后的数字。
- 使用取模操作
x % 10
来获取数字的最后一位。 - 使用整除操作
x / 10
来移除数字的最后一位。
-
溢出处理:
- 当反转后的数字可能超过 32 位整数的限制时,需要立即返回 0。32 位有符号整数的范围是 [-2147483648, 2147483647]。
- 我们可以在反转过程中,判断即将构建的新数字是否会溢出。
- 具体判断方法:在每次添加新的数字之前,检查当前的反转结果是否大于
(INT_MAX / 10)
或小于(INT_MIN / 10)
。
编码思路:
-
reverse
函数声明:- 函数
reverse
接受一个整数x
作为输入,返回该整数反转后的结果。
- 函数
-
反转逻辑:
- 通过
x % 10
获取整数x
的最后一位数字pop
。 - 通过
x /= 10
去除整数x
的最后一位。 - 每次将
reversed
乘以 10 并加上pop
,构建反转后的数字。
- 通过
-
溢出检测:
- 检查反转结果是否会溢出。在 32 位有符号整数范围内,正数最大为
2147483647
,负数最小为-2147483648
。 - 当
reversed
大于INT_MAX / 10
时,任何进一步的操作都会导致溢出,因此直接返回 0。同理,处理负数时也需要类似的检测。
- 检查反转结果是否会溢出。在 32 位有符号整数范围内,正数最大为
-
输出示例:
- 输入 123,输出反转的结果 321。
- 输入 -123,输出反转的结果 -321。
- 输入 1534236469,由于反转后会超出 32 位整数范围,返回 0。
时间复杂度:
- 时间复杂度:O(log(x)),其中 x 是输入整数。反转过程中每次都会减少一位,因此时间复杂度与整数的位数成比例。
空间复杂度:
- 空间复杂度:O(1),只使用了常数个额外空间。
#include <stdio.h>
#include <limits.h> // 包含 INT_MAX 和 INT_MIN 的定义
int reverse(int x) {
int reversed = 0; // 存储反转后的整数
while (x != 0) {
int pop = x % 10; // 提取最后一位数字
x /= 10; // 移除最后一位数字
// 检查是否会发生溢出
if (reversed > INT_MAX / 10 || (reversed == INT_MAX / 10 && pop > 7)) {
return 0; // 溢出,返回 0
}
if (reversed < INT_MIN / 10 || (reversed == INT_MIN / 10 && pop < -8)) {
return 0; // 溢出,返回 0
}
// 更新反转后的数字
reversed = reversed * 10 + pop;
}
return reversed;
}
int main() {
int x = 123;
printf("Reversed: %d\n", reverse(x)); // 输出:321
x = -123;
printf("Reversed: %d\n", reverse(x)); // 输出:-321
x = 1534236469;
printf("Reversed: %d\n", reverse(x)); // 输出:0(溢出)
return 0;
}
标签:10,数字,实现,反转,reversed,整数,INT
From: https://blog.csdn.net/weixin_48941116/article/details/142918461