当前位置: 首页 > 知识库问答 >
问题:

有人能帮我理解优先队列吗?[闭门]

胡桐
2023-03-14
    class Solution {
    public List<String> topKFrequent(String[] words, int k) {
        List<String> answer = new ArrayList();
        HashMap<String, Integer> frequency = new HashMap<>();
        //record the frequency
        for (String word: words){
            frequency.put(word,frequency.getOrDefault(word,0)+1);
        }
        //record the frequency in the priority queue
        PriorityQueue<String> pq = new PriorityQueue<>((a,b)->{
            if(frequency.get(a) != frequency.get(b)){
                return frequency.get(b) - frequency.get(a);
            }else{
                return frequency.get(b).compareTo(frequency.get(a));
            }
        });
        for(String key:frequency.keySet()){
            pq.offer(key);
        }
        //return the first kth string
        for(int i = 0; i < k;i++){
            answer.add(pq.remove());
        }
        return answer;
    }
}

答案应该是[“我”,“爱”]而我得到了[“爱”,“我”]我想因为在pq中,爱在我之前,所以可能我在pq中做错了,但我不知道如何解决这个问题

共有1个答案

督灿
2023-03-14

我认为问题不在于你对优先队列的理解。由于其他原因,此代码失败。

第一:

frequency.get(a) != frequency.get(b)

您正在比较对象,而不是原始int。您可以通过将其中一个对象转换为这样的对象来解决这个问题

(int) frequency.get(a) != frequency.get(b)

第二:如果两者的频率相同,则需要按字母顺序进行比较。此代码:

frequency.get(b).compareTo(frequency.get(a))

再次比较它们的频率。把它换成这个

a.compareTo(b)

这两个改变应该可以解决你的问题。

 类似资料:
  • 简介 举个例子。我有一个用户表,这个表根据用户名被Hash到不同的数据库实例上,我要找出这些用户中最热门的5个,怎么做?我是这么做的: 在每个数据库实例上找出最热门的5个 将每个数据库实例上的这5条数据按照热门程度排序,最后取出前5条 这个过程看似简单,但是你应用服务器上的代码要写不少。首先需要Query N个列表,加入到一个新列表中,排序,再取前5。这个过程不但代码繁琐,而且牵涉到多个列表,非常

  • 错误 第6:44行:在函数“app”中调用React Hook“useState”,该函数既不是React函数组件,也不是自定义React Hook函数React Hook/rules of Hook 搜索关键字以了解有关每个错误的更多信息。

  • 有没有插件/附加组件可以帮助创建框架?从何处开始创建框架以及如何继续? 你的意见很有价值。 谢谢,阿美

  • (13K星)不管是好是坏,我认为毕加索时代可能已经结束了。

  • 问题内容: 我正在尝试根据文档中提供的示例实现优先级队列。文件:priorityQueue 简而言之,它看起来像这样(不包括所有内容): 该文件中: 如您所见,在与示例进行比较时,我不使用指针,因为这样做会给我一个编译错误,告诉我我的优先级队列未正确实现接口。 这会给我带来以下问题: 该项目未附加到队列中。 我试图写出队列指针地址,它显示了不同的地址。这就解释了为什么它不起作用,但是切片不是地图长

  • 想改进这个问题吗 通过编辑此帖子,添加详细信息并澄清问题。 谁能告诉我我做什么?这不起作用