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
相关产品推荐
相关产品推荐

