场景:
本公司现在要给公司员工发波福利,在员工工作时间会提供大量的水果供员工补充营养。由于水果种类比较多,但是却又不知道哪种水果比较受欢迎,然后公司就让每个员工报告了自己最爱吃的k种水果,并且告知已经将所有员工喜欢吃的水果存储于一个数组中。然后让我们统计出所有水果出现的次数,并且求出大家最喜欢吃的前k种水果。
void GetFavoriteFruit(const vector& fruits,size_t k);
ps:要求打印出最喜欢的水果,并且效率尽可能的高。
提示:尽量STL的容器和算法,这样能更快速高效的实现。
思路:这是典型的求数组中出现次数最多的元素。
可以用hash_map将统计每个水果出现的次数,然后再用优先级队列(大堆)来找出最大的前k个元素。、
代码如下:
#include <iostream> #include <string> #include <hash_map> #include <queue> using namespace std; struct Compare { bool operator()(hash_map<string,int>::iterator t1,hash_map<string,int>::iterator t2) { return t1->second < t2->second; } }; void GetFavoriteFruit(const vector<string>& fruits,size_t k) { if (fruits.empty()||k<1) return ; hash_map<string,int> m; for(int i = 0; i < fruits.size(); ++i) { m[ fruits[i] ]++; //1.统计每种水果出现的次数,用hash_map } hash_map<string,int>::iterator it = m.begin(); while(it != m.end()) { cout << it->first << " "<<it->second << endl; it++; } cout << "*************************************************"<<endl; priority_queue<hash_map<string,int>::iterator, vector<hash_map<string,int>::iterator>,Compare> q; //创建一个元素类型是hash_map迭代器的大堆。 it = m.begin(); //将map迭代器存入优先级队列中。 while(it != m.end() ) { q.push(it); it++; } for(int i = 0; i < k; ++i) //从优先级队列中取出K个元素,就是前k个 { cout <<"元素" << q.top()->first<<"出现了 "<<q.top()->second <<"次"<<endl; q.pop(); } }
测试代码:
int main() { vector<string> fruits; fruits.push_back("apple"); fruits.push_back("banana"); fruits.push_back("apple"); fruits.push_back("watermelon"); fruits.push_back("lemon"); fruits.push_back("banana"); fruits.push_back("apple"); fruits.push_back("apple"); fruits.push_back("lemon"); fruits.push_back("banana"); GetFavoriteFruit(fruits,2); return 0; }
结果: