【问题标题】:What is wrong with my logic for the question CountNonDivisible in Codility? [closed]我对 Codility 中的 CountNonDivisible 问题的逻辑有什么问题? [关闭]
【发布时间】:2021-01-16 16:28:14
【问题描述】:

我正在尝试解决关于 Codility 的 CountNonDivisible 问题,以下是我的解决方案。我的总分只有 55%。我的逻辑是,我会计算数组中存在的元素的所有除数,然后从数组的总长度中减去它们,以获得每个元素的非除数的数量。

这个问题来自 Codility 的课程部分,可以在第 11 课下的链接中查看: CountNonDvisible

import math
def solution(A):
    B = reversed(sorted(A))
    d = dict()
    n = len(A)
    res = dict()
    for i in A:
        if i not in d:
            d[i] = 1
            continue
        d[i]+= 1
    for i in B:
        tmp = 0
        if i == 1:
            res[i] = n-d[i]
            continue
        if i==2 or i==3:
            res[i] = n-d[i]-d.get(1,0)
            continue
        for j in range(2,int(math.sqrt(i)+1)):
            if j in d and i%j == 0:
                if j == i//j:
                    tmp+=d[j]
                else:
                    tmp+=d[j]+d.get(i//j,0)
        if d[i]>1:
            res[i] = n-tmp-d.get(1,0)-d.get(i)
        else:
            res[i] = n-tmp-d.get(1,0)-1
    ans = []
    for i in A:
        ans.append(res[i])
    return ans

【问题讨论】:

  • 代码的作用与您的预期有何不同?请出示minimal reproducible example
  • 好吧,它在 Codility 中没有通过 1 个正确性测试和 3 个性能测试,但是由于测试用例被隐藏,我无法在我的逻辑中找到缺陷。不幸的是,出于同样的原因,没有可重复的例子。

标签: python arrays python-3.x dictionary


【解决方案1】:

首先,让我们编写一个简单的函数,可以正确解决问题,但可能效率不高:

def basic_sol(B):
  return [ len([d for d in B if b % d != 0]) for b in B ]

那我们来做个测试,看看能不能发现一些错误情况:

TRIALS=100
LENGTH=2
MAX_NUM=100
for trial in range(TRIALS):
  B = [ random.randint(1, MAX_NUM) for j in range(LENGTH) ]

  my_sol = solution(B)
  correct_sol = basic_sol(B)

  if(my_sol != correct_sol):
    print(B)
    print(my_sol)
    print(correct_sol)
    break

这会很快产生一些结果:

Problem [63, 21]
My solution [1, 1]
Correct solution [0, 1]

由于 63 可以被它自己和被 21 整除,所以列表中不被它整除的项目数应该为零,但您的程序返回 1。

现在你的工作是处理这个测试用例,在你的程序中运行它,并找出它被错误处理的原因。


另外,问问自己你的解决方案到底比给出的单行解决方案效率高多少。似乎两者都是O(n ^ 2)。也许这里有更有效的处理方式?

【讨论】:

  • 谢谢!让我试试这个方法
  • 我检查可编码性的第一件事是虚拟解决方案 (O(n^2)),它也得到 55%。我认为关键是要以某种方式使用 Erathostene 筛来获得更有效的算法。
猜你喜欢
  • 1970-01-01
  • 2016-12-15
  • 1970-01-01
  • 1970-01-01
  • 2012-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-01
相关资源
最近更新 更多