目录
介绍
给你一个 32 位的有符号整数 x
,返回将 x
中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 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位有符号整数的范围,若超过则返回0。
- 最后,根据符号返回反转后的结果。
代码实现
def reverse(x: int) -> int:
INT_MAX = 2**31 - 1
INT_MIN = -2**31
# 判断符号并取绝对值
sign = 1 if x >= 0 else -1
x *= sign
# 反转数字部分
reverse_num = 0
while x:
digit = x % 10
x //= 10
# 检查溢出情况
if reverse_num > INT_MAX // 10 or (reverse_num == INT_MAX // 10 and digit > 7):
return 0
if reverse_num < INT_MIN // 10 or (reverse_num == INT_MIN // 10 and digit < -8):
return 0
reverse_num = reverse_num * 10 + digit
return sign * reverse_num
# 测试
x = 123
print(reverse(x)) # 输出:321
x = -123
print(reverse(x)) # 输出:-321
x = 120
print(reverse(x)) # 输出:21
这段代码首先判断输入整数的符号,并取绝对值。然后,使用循环逐位反转数字部分,同时检查溢出情况。根据题目要求,如果反转后的整数超过32位有符号整数的范围,就返回0。最后,根据符号返回反转后的结果。
总结
通过以上Python代码实现,我们可以轻松地反转32位有符号整数的数字部分。该算法的时间复杂度为O(log(x)),其中x是输入整数的大小。在解决类似问题时,我们需要考虑边界情况和溢出问题,以确保算法的正确性和鲁棒性。
希望本文能帮助你理解如何反转32位有符号整数,并提供了一个简单而优雅的Python解决方案。如果有任何疑问或建议,请随时提出。