給定一個數組a
,實現其組合達到n
的最佳方法是什麼?例如:組合達到n
a = %i[a b c]
n = 2
# Expected => [[], [:a], [:b], [:c], [:a, b], [:b, :c], [:c, :a]]
給定一個數組a
,實現其組合達到n
的最佳方法是什麼?例如:組合達到n
a = %i[a b c]
n = 2
# Expected => [[], [:a], [:b], [:c], [:a, b], [:b, :c], [:c, :a]]
做如下:
a = %w[a b c]
n = 3
0.upto(n).flat_map { |i| a.combination(i).to_a }
# => [[], ["a"], ["b"], ["c"], ["a", "b"],
# ["a", "c"], ["b", "c"], ["a", "b", "c"]]
@sawa感謝您的補充...... :-) –
另一種方式:
def all_combis(a, n, b=[])
n.zero? ? b.unshift([]) : all_combis(a, n-1, b.unshift(*a.combination(n)))
end
all_combis(%i[a b c], 0)
#=> [[]]
all_combis(%i[a b c], 1)
#=> [[], [:a], [:b], [:c]]
all_combis(%i[a b c], 2)
#=> [[], [:a], [:b], [:c], [:a, :b], [:a, :c], [:b, :c]]
all_combis(%i[a b c], 3)
#=> [[], [:a], [:b], [:c], [:a, :b], [:a, :c], [:b, :c], [:a, :b, :c]]
如果秩序和效率是不重要的,這也適用:
a.repeated_combination(n).map(&:uniq) << []
%i[a b c].repeated_combination(2).map(&:uniq) << []
#=> [[:a], [:a, :b], [:a, :c], [:b], [:b, :c], [:c], []]
+1幫助我記住'repeated_combination' .. **遞歸**技術也不錯。 –
你想要組合進行排序?你期望什麼樣的價值?一個大小如何? –
@IvayloStrandjev不,它可以從最長的一個開始,也可以以任何順序開始。 – sawa
不錯的問題.. +1我喜歡它...... :-) –