首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在整数列表中查找所有相加为一个数字的数字

在整数列表中查找所有相加为一个数字的数字
EN

Stack Overflow用户
提问于 2015-09-01 04:55:17
回答 2查看 768关注 0票数 3

我在一次面试中被问到了这个问题。给出以下列表:

代码语言:javascript
运行
复制
[1,2,5,7,3,10,13]

找出加起来等于5的数字。

我的解决方案如下:

代码语言:javascript
运行
复制
#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。如果是,那么我可以停止循环。我有种感觉,面试官对这个答案不满意。有没有人能推荐一个更好的供我将来参考?

EN

回答 2

Stack Overflow用户

发布于 2015-09-01 05:05:48

这将返回输入的powerset中总和为5的所有元素:

代码语言:javascript
运行
复制
>>> 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)]
票数 4
EN

Stack Overflow用户

发布于 2015-09-01 05:07:11

这就是我要做的:

代码语言:javascript
运行
复制
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参数

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32319836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档