求出大家最喜欢吃的前k种水果(求数组中出现次数最多的)

场景:

       本公司现在要给公司员工发波福利,在员工工作时间会提供大量的水果供员工补充营养。由于水果种类比较多,但是却又不知道哪种水果比较受欢迎,然后公司就让每个员工报告了自己最爱吃的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;
}


结果:




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值