检查数组子集

时间:2012-02-14 22:50:08

标签: ruby

我有一个挑战,我试图编写一个接收数组的方法并返回两个子集和排列,包括初始数组。如何检查阵列中的特定模式。例如,给定此数组:

[a,b,c]

子集返回将是:

[a,b,c,], [a,b], [b,c], [c,a]

我还需要检查每个子集是否包含特定字母。这是我的代码:

def conflict_free?(a)
  return a.permutation(2).to_a
end

2 个答案:

答案 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

可以在开头或结尾添加初始数组。最后是它。