Python实现32位有符号整数反转问题及故障排查求助
嘿,我来帮你搞定这个整数反转的问题!之前我也踩过溢出判断的坑,咱们一步步捋清楚核心逻辑和常见问题~
整数反转问题的正确解法思路
这个问题的核心难点在于在反转过程中提前判断溢出——如果等反转完成再判断,很多语言(比如C++)会直接截断超出32位范围的数值,导致判断失效;就算是Python这种支持大整数的语言,也不符合题目里“运行环境仅能存储32位有符号整数”的模拟要求。
核心步骤拆解
- 先分离符号:用一个变量存下输入整数的正负标记,把原数转成正数处理,最后再把符号加回去,避免负数取模/整除的异常。
- 逐位提取反转:通过
%10拿到最后一位数字,用result = result *10 + digit构建反转结果,同时把原数//10缩小,直到原数变为0。 - 关键的溢出预判:每次更新结果前,先判断当前结果是否会触发溢出:
- 正数上限是
2^31 -1 = 2147483647,所以如果当前结果大于214748364(即(2^31-1)//10),或者等于214748364且要加的数字大于7,直接返回0。 - 负数下限是
-2^31 = -2147483648,转成正数处理的话,只要按正数上限判断即可,最后乘符号时自然会处理负数情况。
- 正数上限是
示例代码(Python)
def reverse(x: int) -> int: sign = 1 if x >= 0 else -1 x_abs = abs(x) result = 0 max_limit = (2**31 - 1) // 10 max_last_digit = (2**31 - 1) % 10 # 结果为7 while x_abs > 0: digit = x_abs % 10 # 提前判断溢出,避免结果超出范围 if result > max_limit or (result == max_limit and digit > max_last_digit): return 0 result = result * 10 + digit x_abs = x_abs // 10 return result * sign
常见故障排查
你提到解决方案有故障,大概率是这几个坑:
- 溢出判断时机错误:比如先完成反转再和
2^31-1/-2^31比较,这时候溢出的数值可能已经被截断,判断完全失效。 - 负数处理失误:直接对负数取模或整除时,部分语言(比如Python)会返回非预期结果,比如
-123%10得到的是7而不是-3,提前转成正数处理能避开这个问题。 - 末尾0处理不当:比如输入120时担心反转出021,但逐位反转的逻辑里,末尾的0会被先加入结果,但后续的有效数字会覆盖前面的0,最终自然得到21,不需要额外处理。
关键测试用例验证
- 输入123 → 输出321:符合预期
- 输入-123 → 输出-321:符号和数字反转都正确
- 输入120 → 输出21:末尾0被自动忽略
- 输入2147483647 → 反转后溢出,返回0
- 输入-2147483648 → 反转后溢出,返回0
如果你的代码还有具体的测试用例不通过,或者有特定的报错,可以把代码贴出来,我帮你针对性分析!
内容的提问来源于stack exchange,提问作者casillas
相关产品推荐
相关产品推荐

