我在一次面试中被问到了这个问题。给出以下列表:
[1,2,5,7,3,10,13]找出加起来等于5的数字。
我的解决方案如下:
#sort the list:
l.sort()
result = ()
for i in range(len(l)):
    for j in range(i, len(l)):
         if l[i] + l[j] > 5:
             break
         elif l[i] + l[j] == 5:
             result += (l[i], l[j])我提出的想法是对列表进行排序,然后循环,看看和是否大于5。如果是,那么我可以停止循环。我有种感觉,面试官对这个答案不满意。有没有人能推荐一个更好的供我将来参考?
发布于 2015-09-01 05:05:48
这将返回输入的powerset中总和为5的所有元素:
>>> input = [1,2,5,7,3,10,13]
>>> import itertools
>>> def powerset(l):
...     return itertools.chain.from_iterable((itertools.combinations(l, i) for i in range(len(l)+1)))
...
>>> filter(lambda v: sum(v) == 5, powerset(input))
[(5,), (2, 3)]发布于 2015-09-01 05:07:11
这就是我要做的:
from itertools import permutations
from random import randint
base_list = [randint(-10, 10) for x in range(20)]
def five_sum(base_list, combinations):
    has_negatives = any([base for base in base_list if base < 0])
    if not has_negatives:
        filtered_list = [base for base in base_list if base <= 5]
    else:
        filtered_list = base_list
    perms = list(permutations(filtered_list, combinations))
    filtered_perms = [perm for perm in perms if sum(perm) == 5]
    print(filtered_perms)
    for perm in set(filtered_perms):
        yield perm
print(base_list)
print(list(five_sum(base_list, 2)))在理想情况下,我有无限的内存,我会用perms = [list(permutations(filtered_list, i)) for i in range(len(filtered_list) + 1)]替换combinations参数
https://stackoverflow.com/questions/32319836
复制相似问题