题目
题目描述
给你一个 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
提示:
-2^31 <= x <= 2^31 - 1
题目链接
题解
要实现将一个 32 位有符号整数 x
中的数字部分反转,并确保结果在 32 位有符号整数的范围内,可以按照以下步骤进行:
- 处理负号:如果
x
是负数,先将其转换为正数,最后再添加负号。 - 反转数字:通过取模和除法操作,逐步将数字反转。
- 检查溢出:在每次添加新数字之前,检查是否会超出 32 位有符号整数的范围。
Python 实现
def reverse(x: int) -> int:
INT_MAX = 2**31 - 1 # 2147483647
INT_MIN = -2**31 # -2147483648
# 处理负号
sign = -1 if x < 0 else 1
x = abs(x)
reversed_num = 0
while x != 0:
digit = x % 10
x //= 10
# 检查溢出
if reversed_num > (INT_MAX - digit) // 10:
return 0
reversed_num = reversed_num * 10 + digit
return sign * reversed_num
详细解释
-
处理负号:
sign = -1 if x < 0 else 1
:如果x
是负数,设置sign
为 -1,否则设置为 1。x = abs(x)
:将x
转换为正数,方便后续处理。
-
反转数字:
reversed_num = 0
:初始化反转后的数字为 0。while x != 0:
:当x
不为 0 时,继续循环。digit = x % 10
:取x
的最后一位数字。x //= 10
:去掉x
的最后一位数字。if reversed_num > (INT_MAX - digit) // 10:
:检查是否会超出 32 位有符号整数的范围。如果reversed_num * 10 + digit
会超出范围,则返回 0。reversed_num = reversed_num * 10 + digit
:将当前数字添加到反转后的数字中。
-
返回结果:
return sign * reversed_num
:将反转后的数字乘以sign
,恢复负号(如果有的话)。
通过这种方法,我们可以在不使用 64 位整数的情况下,有效地将 32 位有符号整数的数字部分反转,并确保结果在合法范围内。