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

