ruby:查找数组中出现次数最多的项目(如果有)

时间:2017-10-30 15:52:25

标签: arrays ruby max

使用此代码,我可以在数组中找到大多数项目:

letters.max_by { |i| letters.count(i) } 

但是这将为

返回2
a = [1, 2, 2, 3, 3]

虽然3具有相同的发生率。如果确实存在最多次出现的项目,我该怎么知道呢?如果没有单一的冠军,我想获得false

4 个答案:

答案 0 :(得分:3)

这非常丑陋,需要改进,但是:

def champion(array)
  grouped = array.group_by(&:itself).values.group_by(&:length)

  best = grouped[grouped.keys.max]

  if (best.length == 1)
    best[0][0]
  else
    false
  end
end

我不确定是否有一个简单的单次解决方案,至少没有一个不是 O(n ^ 2)或更糟,这是不寻常的。

答案 1 :(得分:1)

如果你不关心表现,我想你可以这样做:

def max_occurrences(arr)
  arr.sort.max_by { |v| arr.count(v) } != arr.sort.reverse.max_by { |v| arr.count(v) } ? false : arr.max_by { |v| arr.count(v) }
end

答案 2 :(得分:0)

我会做这样的事情:

def max_occurrences(arr)
  counts = Hash.new { |h, k| h[k] = 0 }
  grouped_by_count = Hash.new { |h, k| h[k] = [] }
  arr.each { |el| counts[el] += 1 } # O(n)
  counts.each { |el, count| grouped_by_count[count] << el } # O(n)
  max = grouped_by_count.sort { |x, y| y[0] <=> x[0] }.first[1] # O(n log n)
  max.length == 1 ? max[0] : false
end

它没有时髦的单行,但它可读并且运行时间小于O(n log n)。

答案 3 :(得分:0)

<#include "https://system....." parse=false>