全面披露。这是一个面试/预筛选问题,我在面试期间未能解决。为了我自己的利益,我决定在 Erlang 中实现它。
这是问题陈述:
您必须找到数组的子集数,其中最大数是剩余数字的总和。例如,对于以下输入:1、2、3、4、6
子集将是
1 + 2 = 3
1 + 3 = 4
2 + 4 = 6
1 + 2 + 3 = 6
这是我的解决方案:
% credit: http://stackoverflow.com/questions/1459152/erlang-listsindex-of-function
index_of(Item, List) -> index_of(Item, List, 1).
index_of(_, [], _) -> not_found;
index_of(Item, [Item|_], Index) -> Index;
index_of(Item, [_|Tl], Index) -> index_of(Item, Tl, Index+1).
% find sums
findSums(L) ->
Permutations=generateAllCombos(L),
lists:filter(fun(LL) -> case index_of(lists:sum(LL), L) of
not_found -> false;
_ -> true
end
end, Permutations).
% generate all combinations of size 2..legnth(L)-1
generateAllCombos(L) ->
NewL=L--[lists:last(L)],
Sizes=lists:seq(2,length(NewL)),
lists:flatmap(fun(X) -> simplePermute(NewL,X) end, Sizes).
% generate a list of permutations of size R from list L
simplePermute(_,R) when R == 0 ->
[[]];
simplePermute(L,R) ->
[[X|T] || X <- L, T<-simplePermute(lists:nthtail(index_of(X,L),L),R-1)].
这是一个示例运行:
例子:
18> maxsubsetsum_app:findSums([1,2,3,4,6]).
[[1,2],[1,3],[2,4],[1,2,3]]
问题
- 亲爱的 Erlangers(Erlangists?)在您看来,这看起来像规范的 Erlang 吗?
- 有没有更好的方式来表达我的所作所为?
- 是否有一个更清洁的解决方案(这是相当蛮力的)。
谢谢!