如何使用ruby查找数组中的对列表?

时间:2019-05-27 13:17:00

标签: ruby

输入

a = [4, 5, 5, 5, 6, 6, 4, 1, 4, 4, 3, 6, 6, 3, 6, 1, 4, 5, 5, 5]

如何不列出数组中的任何对。

输出:

9

说明

#no 1(1 pair)
#no 3(1 pair)
#no 4(2 pairs)
#no 5(3 pairs)
#no 6(2 pairs)
#so total 9 pairs

3 个答案:

答案 0 :(得分:2)

这是另一种选择:

a.group_by(&:itself).transform_values{ |v| v.size / 2 }.values.sum
#=> 9


工作原理。

首先按值对元素进行分组:

a.group_by(&:itself) #=> {4=>[4, 4, 4, 4, 4], 5=>[5, 5, 5, 5, 5, 5], 6=>[6, 6, 6, 6, 6], 1=>[1, 1], 3=>[3, 3]}

然后将密钥转换为对数:

a.group_by(&:itself).transform_values{ |v| v.size / 2 } #=> {4=>2, 5=>3, 6=>2, 1=>1, 3=>1}

因此,获取哈希值:

a.group_by(&:itself).transform_values{ |v| v.size / 2 }.values #=> [2, 3, 2, 1, 1]

最后,对这些值求和,这是上面发布的第一行代码。

答案 1 :(得分:1)

arr = [4, 5, 5, 5, 6, 6, 4, 1, 4, 4, 3, 6, 6, 3, 6, 1, 4, 5, 5, 5]
hash = Hash.new(0)
arr.each { |e| hash[e] += 1 }
hash.values.reduce(0) { |s, n| s += n / 2 } // => 9

由于从我的收集中可以看出,基本上在整数配对一次后就删除了整数,因此从技术上讲,它只是整数除以二。

[1] How to count identical string elements in a Ruby array

[2] Reduce Hash Values

答案 2 :(得分:1)

我已经做到了,它有效

  b = []
  a.uniq.each { |i| b.push(a.count(i)/2)}
  b.sum