5.【附加题】– 本公司现在要给公司员工发波福利,在员工工作时间会提供大量的水果供员工补充营养。 由于水果种类比较多,但是却又不知道哪种水果比较受欢迎,然后公司就让每个员工报告了自己最爱吃的k种水果, 并且告知已经将所有员工喜欢吃的水果存储于一个数组中。然后让我们统计出所有水果出现的次数, 并且求出大家最喜欢吃的前k种水果。
void GetFavoriteFruit(const vector& fruits,size_t k);
ps:要求打印出最喜欢的水果,并且效率尽可能的高。 提示:尽量STL的容器和算法,这样能更快速高效的实现。
#include<iostream> #include<map> #include<vector> #include<string> #include <algorithm> using namespace std; bool myfunction(map<string,int>::iterator l,map<string,int>::iterator r) { return l->second > r->second; } void SelectTop(map<string,int>& CountMap,size_t k) { vector<map<string,int>::iterator> v; map<string,int>::iterator it=CountMap.begin(); while (it!=CountMap.end()) { v.push_back(it); it++; } sort(v.begin(),v.end(),myfunction); //3.打印前K个元素 for (size_t j=0;j<k;j++) { cout<<v[j]->first<<"-"<<v[j]->second<<endl; } } void GetFavoriteFruit(const vector<string>& fruits,size_t k) { //1.统计所有水果出现的次数 map<string,int> CountMap; for (size_t i=0;i<fruits.size();i++) { CountMap[fruits[i]]++; } //2.根据水果次数的大小,最map中的元素进行排序 SelectTop(CountMap,k); } int main() { vector<string> v; v.push_back("苹果"); v.push_back("香蕉"); v.push_back("橘子"); v.push_back("桃子"); v.push_back("香蕉"); v.push_back("苹果"); v.push_back("核桃"); v.push_back("西瓜"); v.push_back("樱桃"); v.push_back("杨梅"); v.push_back("火龙果"); v.push_back("菠萝"); v.push_back("苹果"); v.push_back("西瓜"); v.push_back("桃子"); v.push_back("葡萄"); v.push_back("西瓜"); v.push_back("苹果"); v.push_back("杏子"); v.push_back("苹果"); v.push_back("菠萝"); v.push_back("哈密瓜"); v.push_back("苹果"); v.push_back("香蕉"); v.push_back("苹果"); v.push_back("西瓜"); v.push_back("杨梅"); v.push_back("菠萝"); v.push_back("梨"); v.push_back("苹果"); v.push_back("苹果"); v.push_back("西瓜"); v.push_back("香蕉"); v.push_back("苹果"); v.push_back("葡萄"); v.push_back("苹果"); GetFavoriteFruit(v,3); }