我有:
words = ["i", "love", "leet", "i", "love", "code"]
k = 3
"i"
和"love"
会显示两次,但"leet"
和"code"
会显示一次。我想要:
["i", "love", "code"]
而不是"leet"
。这段代码:
words.group_by(&:itself).sort_by {|_, s| -s.length}.first(k).map(&:first)
将显示:
["i", "love", "leet"]
解决此问题的好方法是什么?
可以使用堆来解决,但Ruby不支持Heap。有什么建议吗?我想在不使用gem的情况下这样做,以便我可以在在线代码测试网站上进行演示。
=============================================== ===========================
k
用于频率
所以这个问题是在单词数组中找到k个频率字。
当k为3时,我的计数器选择code
而非leet
。当有相同的频率字时,我想按字母顺序排序,所以我可以先选择一个。
答案 0 :(得分:2)
如果您想在频率相同时按字母顺序排序,按字母顺序排序:
words.group_by { |w| w }.
sort_by { |w, a| [-a.size, w] }. # ⇐ HERE
map(&:first).
first(3)
#⇒ ["i", "love", "code"]