使用Python

时间:2017-12-31 22:21:18

标签: python algorithm

下周我作为第一轮面试接受编码挑战。人力资源部门表示他们将使用Codility作为编码挑战平台。我一直在练习使用Codility课程。

我的问题是我经常在正确性方面获得很高的分数,但我衡量时间复杂度的绩效分数很可怕(我常常得到0%)。

这里的问题是: https://app.codility.com/programmers/lessons/5-prefix_sums/passing_cars/

我的代码是:

def solution(A):
    N = len(A)
    my_list = []
    count = 0
    for i in range(N):
        if A[i] == 1:
            continue
        else:
            my_list = A[i + 1:]
            count = count + sum(my_list)
    print(count)
    return count

应该是O(N)但我的是O(N ** 2)。

  1. 在O(N)时间复杂度下,有人如何解决这个问题?

  2. 一般来说,当你看一个算法问题时,你是如何想出一种方法的呢?

2 个答案:

答案 0 :(得分:5)

每次找到零时,不应对整个数组求和。这使它成为O(n ^ 2)。相反,请注意,每找到一个零将为后面的每个零提供+1:

def solution(A):
    zeros = 0
    passing = 0
    for i in A:
        if i == 0:
            zeros += 1
        else:
            passing += zeros
    return passing

答案 1 :(得分:0)

您可以查看all codility solutionspassingcars示例。

不要忘记1000000000个限制。

def solution(a):
    pc=0
    fz=0

    for e in a:
        if pc>1000000000:
            return -1
        if e==0:
            fz+=1
        else:
            pc+=fz           

    return pc