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