You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:13:59