求公司人最喜欢的前K种水果

本公司现在要给公司员工发波福利,在员工工作时间会提供大量的水果供员工补充营养。由于水果种类比较多,但是却又不知道哪种水果比较受欢迎,然后公司就让每个员工报告了自己最爱吃的k种水果,并且告知已经将所有员工喜欢吃的水果存储于一个数组中。然后让我们统计出所有水果出现的次数,并且求出大家最喜欢吃的前k种水果。

 void GetFavoriteFruit(const vector& fruits,size_t k); ps:要求打印出最喜欢的水果,并且效率尽可能的高。 

题目分析:

我们尽可能使用库函数去实现,这样可以节省很多时间,所以我们使用map与库函数算法中的排序算法。

map:底层使用红黑树实现,插入效率高。同时map每一个节点使用pair存储,依照 键值直接排序,键值为pair的first内容。map[] 返回的是pair内容中的second.所以我们使用起来比较简单。


代码实现:

void PrintMap(const map<string, int>& fruit)  //打印map内容
{
	map<string, int>::const_iterator inter = fruit.begin();
	while (inter != fruit.end())
	{
		cout << (*inter).first << " :" << (*inter).second << " ";
		inter++;
	}
	cout << endl;
}

void GetFavoriteFruit(const vector<string>& fruits,size_t k)  //获取前K个喜爱的水果
{
	map<string, int> countfruit;
	for (int i = 0; i < fruits.size(); i++)
	{
		countfruit[fruits[i]]++;
	}

	PrintMap(countfruit);

	vector<map<string, int>::iterator> v;
	map<string, int>::iterator begin = countfruit.begin();
	while (begin != countfruit.end())
	{
		v.push_back(begin);
		begin++;
	}

	struct Complate
	{
		bool operator()(map<string, int>::iterator l1, map<string, int>::iterator l2)
		{
			return (*l1).second > (*l2).second;
		}
	};

	sort(v.begin(), v.end(), Complate());

	for (int i = 0; i < k; i++)
	{
		cout << (*v[i]).first << ":" << (*v[i]).second << "    ";
		if (i !=0 && i % 5 == 0)
		{
			cout << endl;
		}
	}
	cout << endl;
}

测试用例:

void Text()
{
	vector<string> fruit;
	string fruits[] = { "苹果", "葡萄", "苹果", "葡萄", "香蕉", "西瓜", "西瓜", "西瓜", "西瓜", "西瓜", "西瓜", "西瓜", "西瓜", "苹果", "苹果", "苹果", "苹果" };
	for (int i = 0; i < sizeof(fruits) / sizeof(fruits[0]); i++)
	{
		fruit.push_back(fruits[i]);
	}
	GetFavoriteFruit(fruit, 3);
}


运行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值