Python 32位环境下整数校验方法 适配LeetCode7整数反转问题
问题背景
你正在解答的是LeetCode第7题反转整数,题目明确约束:假设运行环境不允许存储64位整数(有符号或无符号)
你给出的可通过测试的初始代码如下:
class Solution: def reverse(self, x: int) -> int: val = 0 pro, x = (1,x) if x>0 else (-1, -x) flag = False while x: val=val*10+x%10 x//=10 if val.bit_length()>31: flag = True break return 0 if flag else val*pro
现有思路的问题
你当前的实现依赖Python的任意精度整数特性,即使val超过32位有符号整数范围仍然可以正常存储并调用bit_length()方法判断长度,但这不符合题目的严格32位环境约束:在真正的32位环境中,val = val*10 + x%10这一步只要结果溢出,就会直接触发未定义行为或者数值截断,根本等不到你执行后续的长度判断逻辑,所以该思路仅在Python这种特殊语言环境下可用,不具备通用性。
你提到的「val.bit_length()限制为31位时新增整数不会改变原有值」的逻辑也不成立,32位有符号整数的最高位是符号位,有效数值位是31位,最大值为2^31-1=2147483647,一旦计算结果超出该范围,在严格32位环境下值会直接被截断,和原计算结果完全不符,无法通过后续逻辑判断是否溢出。
规范的溢出校验方案
正确的校验逻辑是在计算新的val之前就做预判,所有判断操作都在当前val处于合法范围时完成,完全避免溢出操作的执行。
32位有符号整数的取值范围是[-2147483648, 2147483647],我们将输入统一转为正数处理后,仅需要判断是否超过上限2147483647即可,预判规则如下:
- 假设当前val为合法值,下一位要拼接的数字为digit:
- 如果
val > 214748364,则val*10肯定大于2147483647,直接判定溢出 - 如果
val == 214748364,则digit如果大于7,val*10 + digit就会大于2147483647,判定溢出
- 如果
修正后的通用实现代码
class Solution: def reverse(self, x: int) -> int: MAX_INT = 2 ** 31 - 1 sign = 1 if x >= 0 else -1 x = abs(x) val = 0 while x: digit = x % 10 # 提前预判溢出,完全避免溢出操作执行 if val > MAX_INT // 10 or (val == MAX_INT //10 and digit > 7): return 0 val = val * 10 + digit x = x // 10 return val * sign
这个实现完全符合题目约束,所有溢出判断都在溢出操作执行前完成,不需要依赖任意精度整数特性,可直接移植到C++/Java等严格32位环境中使用。
内容的提问来源于stack exchange,提问作者sahasrara62
相关产品推荐
相关产品推荐

