我试着在python中实现它。它通过测试的速度不够快,但运行速度比uoyilmaz的解决方案移植到python快50倍。造成这种情况的代码如下:
#!/usr/bin/env python2.7
from bisect import insort_left
from itertools import combinations
def answer_1(l):
"""My own solution."""
indices = {}
setdefault_ = indices.setdefault
for i, x in enumerate(l):
setdefault_(x, []).append(i)
out = 0
highest_value = max(l)
for i, x in enumerate(l):
multiples = []
for m in xrange(1, int(highest_value/x) + 1):
if x * m in indices:
for j in indices[x * m]:
if i < j:
insort_left(multiples, (j, x * m))
if multiples:
multiples = [m[1] for m in multiples]
for pair in combinations(multiples, 2):
out += pair[1] % pair[0] == 0
return out
def answer_2(l):
"""@uoyilmaz's solution ported from Java."""
out = 0
pair_counts = [0] * len(l)
for i in xrange(1, len(l) - 1):
for j in xrange(i):
if l[i] % l[j] == 0:
pair_counts[i] += 1
for i in xrange(2, len(l)):
for j in xrange(1, i):
if l[i] % l[j] == 0:
out += pair_counts[j]
return out
answer = answer_1
# -----------------------------------------------------------------------------
_SEED = 1.23
def benchmark(sample_count):
from random import seed, randint
import timeit
clock = timeit.default_timer
seed(_SEED)
samples = [[randint(1, 999999) for _ in xrange(randint(2, 2000))]
for _ in xrange(sample_count)]
start = clock()
for sample in samples:
answer(sample)
end = clock()
print("%.4f s elapsed for %d samples." % (end - start, sample_count))
def test():
# Provided test cases.
assert(answer([1, 1, 1]) == 1)
assert(answer([1, 2, 3, 4, 5, 6]) == 3)
# Custom test cases.
assert(answer([1]) == 0)
assert(answer([1, 2]) == 0)
assert(answer([2, 4]) == 0)
assert(answer([1, 1, 1, 1]) == 4)
assert(answer([1, 1, 1, 1, 1]) == 10)
assert(answer([1, 1, 1, 1, 1, 1]) == 20)
assert(answer([1, 1, 1, 1, 1, 1, 1]) == 35)
assert(answer([1, 1, 2]) == 1)
assert(answer([1, 1, 2, 2]) == 4)
assert(answer([1, 1, 2, 2, 2]) == 10)
assert(answer([1, 1, 2, 2, 2, 3]) == 11)
assert(answer([1, 2, 4, 8, 16]) == 10)
assert(answer([2, 4, 5, 9, 12, 34, 45]) == 1)
assert(answer([2, 2, 2, 2, 4, 4, 5, 6, 8, 8, 8]) == 90)
assert(answer([2, 4, 8]) == 1)
assert(answer([2, 4, 8, 16]) == 4)
assert(answer([3, 4, 2, 7]) == 0)
assert(answer([6, 5, 4, 3, 2, 1]) == 0)
assert(answer([4, 7, 14]) == 0)
assert(answer([4, 21, 7, 14, 8, 56, 56, 42]) == 9)
assert(answer([4, 21, 7, 14, 56, 8, 56, 4, 42]) == 7)
assert(answer([4, 7, 14, 8, 21, 56, 42]) == 4)
assert(answer([4, 8, 4, 16]) == 2)
def main():
test()
benchmark(100)
if __name__ == '__main__':
main()
现在,如果任何人有关于如何进一步加快这一个想法,我很开放的建议。
提示:在您的问题中放置超过20行的文本是没有意义的,这对问题无关紧要。只要去:问题/输入/输出/你的源代码。 – GhostCat
并提示::为什么使用单个字符“I”作为名称为该列表;这使得你的代码很难阅读。 – GhostCat
什么是“幸运三倍”? – user2829759