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

Codility最小缺失正整数Demo任务Python代码得88%,问题出在哪里?

数组最小正缺失整数Codility任务实践

我正在做Codility的Demo任务,要求设计一个函数,找出数组中大于0的最小缺失整数。我最早写了一版可正常运行的函数,但Codility测试得分只有88%(正确率80%),我一直想不出会在什么输入场景下运行失败。

初始88分版本代码

def solution(A):
    # 若数组存在负值,将所有负值置为0
    if any(n < 0 for n in A):
        A = [(i > 0) * i for i in A]
        count = 0
    else: 
        count = 1
    # 去重
    A = set(A) 
    # 此时数组可能全是负数,或者只有同一个重复值
    # 若全是负数、只有重复0,返回1
    # 若只有重复的1,返回2
    # 若只有其他重复值,返回1
    if (len(A) == 1):
        if (list(A)[0] == 1):
            return 2
        else:
            return 1
    # 排序数组
    A = sorted(A)
    for j in range(len(A)):
        # 测试当前值是否大于0或大于等于count,是则说明该值存在,不是最小缺失值
        # 如果第一个数是0、第二个数不是1的话,这个逻辑会失效
        if (A[j] <= count or A[j] == 0): # 若数值小于等于count或为0,继续计数
                count = count + 1
        elif (j == 1 and A[j] > 1): 
            return 1
        else: 
             return count
    return count

更新:写完上述版本后我把得分提升到了88%,但仍有部分测试用例不通过。我希望Codility能给出具体的失败输入,这个功能可能需要完整订阅才能用,我目前只是体验测试阶段。

更新2:采纳Tranbi的建议优化代码后,拿到了100分,最终代码如下:

最终100分版本代码

def solution(A):
    # 过滤所有0和负数
    A = [i for i in A if i > 0]
    # 此时如果数组为空,说明原数组只有0、负数或二者的组合,返回1
    if (len(A) == 0): return 1
    count = 1
    # 去重
    A = set(A) 
    # 此时数组可能只有同一个重复值
    # 若只有重复的1,返回2
    # 若只有其他重复值,返回1
    if (len(A) == 1):
        if (list(A)[0] == 1):
            return 2
        else:
            return 1
    # 排序数组
    A = sorted(A)
    for j in range(len(A)):
        # 测试当前值是否大于等于count,是则说明该值存在,不是最小缺失值
        if (A[j] <= count): # 若数值小于等于count,继续计数
                count = count + 1
        else: 
             return count 
    return count

内容的提问来源于stack exchange,提问作者Astro.Bacon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 20:30:04