使用此代码,我可以在数组中找到大多数项目:
letters.max_by { |i| letters.count(i) }
但是这将为
返回2
a = [1, 2, 2, 3, 3]
虽然3
具有相同的发生率。如果确实存在最多次出现的项目,我该怎么知道呢?如果没有单一的冠军,我想获得false
。
答案 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>