C++,利用STL的priority_queue

字符串出现次数的TopK问题

http://www.nowcoder.com/practice/fd711bdfa0e840b381d7e1b82183b3ee

优先队列出队的是当前优先级最高的元素,我们要做的是把出现次数多的留下,所以比较器要以次数少为优先级高,其逻辑与默认的less行为相反

    vector<vector<string> > topKstrings(vector<string>& strings, int k) {
        // write code here
        vector<vector<string> > ans;
        if (strings.empty() || strings.size() < k)
            return ans;
        // 记录每个元素出现的次数
        unordered_map<string, int> map;
        for (const auto& string : strings) {
            ++map[string];
        }
        // 按照出现次数排序,次数相同按照字典序
        auto cmp = [](const pair<string, int>& p1, const pair<string, int> p2) {
            return p1.second==p2.second?p1.first<p2.first:p1.second>p2.second;
        };
        // 将全部元素入堆
        priority_queue<pair<string, int>, vector<pair<string, int>>, decltype(cmp)> min_heap(cmp);
 
        for ( const auto& pair: map) {
            min_heap.emplace(pair);
            if (min_heap.size() > k)
                min_heap.pop();
        }
         ans.reserve(k);
         //出队时是按照出现次数从低到高,因此需要之后reverse
         while(!min_heap.empty()) {
            auto p = min_heap.top();
            //数组不要向begin()位置插入元素,应该插入到end()位置
            ans.emplace_back(vector<string>{p.first,to_string(p.second)});
            min_heap.pop();
         }
         reverse(ans.begin(),ans.end());
         return ans;
    }
全部评论

相关推荐

2024-12-27 23:45
已编辑
三江学院 Java
程序员牛肉:死局。学历+无实习+项目比较简单一点。基本就代表失业了。 尤其是项目,功能点实在是太假了。而且提问点也很少。第一个项目中的使用jwt和threadlocal也可以作为亮点写出来嘛?第二个项目中的“后端使用restful风格”,“前端采用vue.JS”,“使用redis”也可以作为亮点嘛? 项目实在是太简单了,基本就是1+1=2的水平。而你目标投递的肯定也是小厂,可小厂哪里有什么培养制度,由于成本的问题,人家更希望你来能直接干活,所以你投小厂也很难投。基本就是死局,也不一定非要走后端这条路。可以再学一学后端之后走测试或者前端。 除此之外,不要相信任何付费改简历的。你这份简历没有改的必要了,先沉淀沉淀
点赞 评论 收藏
分享
01-14 19:01
吉首大学 Java
黑皮白袜臭脚体育生:加个项目吧,一般需要两个项目一业务一轮子呢,简历统一按使用了什么技术实现了什么功能解决了什么问题或提升了什么性能指标来写
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

更多
牛客网
牛客企业服务