我有一个挑战,我试图编写一个接收数组的方法并返回两个子集和排列,包括初始数组。如何检查阵列中的特定模式。例如,给定此数组:
[a,b,c]
子集返回将是:
[a,b,c,], [a,b], [b,c], [c,a]
我还需要检查每个子集是否包含特定字母。这是我的代码:
def conflict_free?(a)
return a.permutation(2).to_a
end
答案 0 :(得分:2)
以下是如何获取您正在寻找的子集:
def subsets(a)
2.upto(a.length).flat_map {|n| a.combination(n).to_a}
end
irb(main):023:0> subsets(["a", "b", "c"])
=> [["a", "b"], ["a", "c"], ["b", "c"], ["a", "b", "c"]]
您想要的任何其他内容,您必须编辑您的问题并提供更多详细信息。
答案 1 :(得分:0)
这是一个非常紧凑和快速的解决方案:
def conflict(a)
a.combination(2).to_a << a
end
>> [["a", "b"], ["a", "c"], ["b", "c"], ["a", "b", "c"]]
如果你在开始时想要初始数组,那么就会牺牲一点速度。然而,最好的方法是:
def conflict(a)
temp = [a]
a.combination(2).each { |com| temp << com}
temp
end
>> [["a", "b", "c"], ["a", "b"], ["a", "c"], ["b", "c"]]
如果输入不是3,那么这将起作用:
def conflict(a)
temp = []
2.upto(a.size-1) {|i| temp += a.combination(i).to_a}
temp << a
end
可以在开头或结尾添加初始数组。最后是它。