下周我作为第一轮面试接受编码挑战。人力资源部门表示他们将使用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)。
在O(N)时间复杂度下,有人如何解决这个问题?
一般来说,当你看一个算法问题时,你是如何想出一种方法的呢?
答案 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 solutions和passingcars示例。
不要忘记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