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

Python计算最长二进制间隙的函数结果错误,无法定位原因

Codility二进制间隙题目代码bug修复

问题定位

你的代码输入9(二进制1001)返回0的核心原因是elif分支的切片边界计算错误:

  • 对N=9来说,转换后的二进制字符串是"1001",长度y=4
  • 遍历到第一个0(索引1)时,你写的切片范围是x_string[index+1 : y-1]也就是x_string[2:3],取到的值是"0";等式右侧生成的0串长度是y-1 - (index+1) = 1,也就是"0",两边相等,判断条件不成立,count不会累加
  • 遍历到第二个0(索引2)时,切片范围是x_string[3:3]取到空字符串,右侧生成的0串长度是0,也是空字符串,判断条件依旧不成立,count始终为0,最终返回结果错误。

你原本想通过判断后续字符是否全为0,来排除尾部未被1包裹的0,这个思路本身没问题,但手写切片边界和字符串全0比较的写法非常容易出边界错误,而且代码冗余度高。另外你的代码还有两个不规范的点:

  • 用max作为变量名,会覆盖Python内置的max()函数,容易引发后续未知错误
  • Codility题目要求函数通过return返回结果,你用print输出结果会导致判题机无法识别返回值,直接判错

修复方案

方案1:最小改动修正原有代码

只需要调整切片上界和对应0串长度的计算逻辑,替换变量名、把print改成return即可:

def Solution(N):
    x = bin(N)[2:]
    x_string = str(x)
    y = len(x_string)
    count = 0
    max_gap = 0
    for index, item in enumerate(x_string):
        if item == "1":
            count = 0
        elif item == "0" and x_string[index + 1:y] != "0"*(y - (index + 1)):
            count = count + 1
            if count > max_gap:
                max_gap = count
    return max_gap

方案2:更简洁的无额外判断实现

其实完全不需要写复杂的后续字符串判断,只要把更新最大间隙的逻辑放在遇到字符1的分支里,天然就能排除尾部0的干扰——尾部的0后面永远遇不到1,永远不会触发最大间隙更新,自然不会被计入结果:

def Solution(N):
    binary_str = bin(N)[2:]
    max_gap = 0
    current_gap = 0
    for c in binary_str:
        if c == '1':
            max_gap = max(max_gap, current_gap)
            current_gap = 0
        else:
            current_gap += 1
    return max_gap

这个实现可以覆盖所有测试用例,包括你提到的N=9返回2、N=16返回0的场景,时间复杂度O(n),空间复杂度O(1)(不计入二进制字符串转换的开销),完全符合Codility的性能要求。


内容的提问来源于stack exchange,提问作者Blume1932

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 16:15:37