Ruby 如何找出数组中出现频率最高的元素?

alphaliu · 2013年02月06日 · 最后由 yangff 回复于 2013年03月08日 · 4208 次阅读

需要找出数组中出现频率最高的元素,我找了一下,可以像下面这种写法。

nums = [1, 2, 4, 3, 1, 4, 1, 1, 4]
num_hash = Hash[nums.uniq.map { |num| [num, nums.count(num)] }]
most_freq = nums.sort_by { |num| num_hash[num] }.last
# most_freq == 1

基本思想就是用一个 hash 先存好每个元素出现的次数然后再对原数组依据次数的高低排序,最后一个就是出现次数最高的元素。 我总觉得会有更好的解法,不知各位高手如何解的?

#2 楼 @AlphaLiu nums.group_by{|i|i}.sort_by{|i|i.length}.first.first

#3 楼 @gaicitadie 不错不错,挺好!

#5 楼 @gaicitadie 刚刚看了一下,好像有点不对。

nums = [2, 1, 1, 1, 2, 1, 4, 3]
nums.group_by{|i|i}.sort_by{|i|i.length}.first.first
#2

用下面这个才对

nums.group_by{|i|i}.sort_by{|k, i|i.length}.last.first

nums.group_by{|i|i}.sort_by{|i|-i[1].length}.first.first

nums.group_by {|i| i}.max_by {|k, v| v.count }[0]

#8 楼 @hysios 还有 max_by 这个函数,没想过呢。


nums.group_by{|i| nums.count(i)}.max[1][0]

nums.max_by{|x| nums.count(x) }

目测这么 max_by 是 O(n^2)

#10 楼 @sevk 代码越来越短了:-D

排序之后 O(N)。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号