本公司现在要给公司员工发波福利,在员工工作时间会提供大量的水果供员工补充营养。由于水果种类比较多,但是却又不知道哪种水果比较受欢迎,然后公司就让每个员工报告了自己最爱吃的k种水果,并且告知已经将所有员工喜欢吃的水果存储于一个数组中。然后让我们统计出所有水果出现的次数,并且求出大家最喜欢吃的前k种水果。
分析:一看这题就是典型的求数组中出现次数最多的前k个数,
首先我们应该用哈希表或map先统计元素出现的次数,在用堆(优先级队列)求出次数最多的前k个数。
struct Compare //函数对象,堆中的元素比较的方式
{
bool operator()(map<int,int>::iterator it1, map<int,int>::iterator it2)
{
return it1->second < it2->second;
}
};
void GetFavoriteFruit(const vector<int>& fruits, size_t k)
{
if(fruits.empty()||k <1)
return ;
map<int,int> m;
for(int i = 0; i < fruits.size(); ++i)
{
m[ fruits[i] ]++; //1.统计每种水果出现的次数,linux底下没有unordered_map,所以用map
}
map<int,int>::iterator it = m.begin();
while(it != m.end())
{
cout << it->first << " "<<it->second << endl;
it++;
}
cout << "*************************************************"<<endl;
priority_queue<map<int,int>::iterator, vector<map<int,int>::iterator>,Compare> q; //创建一个元素类型是map迭代器的大堆。
it = m.begin(); //将map迭代器存入优先级队列中。
while(it != m.end() )
{
q.push(it);
it++;
}
for(int i = 0; i < k; ++i)
{
cout << "元素:"<< q.top()->first << "出现几次:"<< q.top()->second <<endl;
q.pop();
}
}