Python实现无乘除模运算除法时出现未捕获运行时错误求助
错误原因分析
- 直接触发运行时错误的原因是类实例方法调用错误:
loop是Solution类的成员方法,在divide函数中调用时没有加self.前缀,会触发NameError: name 'loop' is not defined的报错。 - 逻辑覆盖不全:现有代码只处理了被除数为正的两种场景,没有覆盖被除数为负、被除数为0的情况,未匹配的分支没有返回值,会触发非预期的返回结果。
- 时间复杂度不达标:现有
loop方法采用逐次减除数的逻辑,时间复杂度为O(n),当被除数极大时会直接超时,不符合题目O(logn)的要求。 - 边界处理缺失:如果被除数为负数,
range(a)会生成空序列,loop方法会直接返回0,计算结果完全错误。
修复方案
首先修复直接的运行时错误,再优化时间复杂度、补全逻辑覆盖,修复后的完整代码如下:
class Solution: def divide(self, a: int, b: int) -> int: # 提前处理结果符号,异或判断是否符号不同 sign = -1 if (a < 0) ^ (b < 0) else 1 # 统一转为绝对值计算,避免负数逻辑干扰 dividend = abs(a) divisor = abs(b) res = 0 # 位运算实现O(logn)复杂度的除法 while dividend >= divisor: # 找到当前可以一次性减掉的最大除数倍数(除数*2^k) temp = divisor multiple = 1 while dividend >= (temp << 1): temp <<= 1 multiple <<= 1 # 减去对应倍数的除数,商累加对应倍数 dividend -= temp res += multiple # 应用符号 res = res * sign # 若题目要求符合32位有符号整数范围,可打开下方边界判断 # return min(max(res, -2**31), 2**31 - 1) return res
修复说明
- 调整了方法结构,避免了原有的实例方法调用错误。
- 采用位运算左移的方式批量计算可减的除数倍数,时间复杂度降到O(logn),完全符合题目要求。
- 先统一处理符号,将被除数和除数都转为正数计算,最后再恢复符号,覆盖所有正负组合的场景。
- 补全了边界处理逻辑,避免负数、0值场景下的计算错误。
内容的提问来源于stack exchange,提问作者TeraCotta
相关产品推荐
相关产品推荐

