输入:
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
答案 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
由于从我的收集中可以看出,基本上在整数配对一次后就删除了整数,因此从技术上讲,它只是整数除以二。
答案 2 :(得分:1)
我已经做到了,它有效
b = []
a.uniq.each { |i| b.push(a.count(i)/2)}
b.sum