最受欢迎的前K种水果
程序员文章站
2022-05-26 17:53:27
...
某公司将所有员工喜欢吃的水果存储于一个数组中。要求:统计出所有水果出现的次数,并且求出大家最喜欢吃的前k种水果。
1、统计所有水果出现的次数,我们可以使用map<string, int>
结构,string存储水果名,int存储水果数目;
2、求大家最喜欢吃的前k种水果,我们可以使用vector<map<string, int>::iterator>
结构存放每一种水果,然后通过iterator->second
对vector进行排序,就可以找到前K种水果啦。
具体实现:
//统计出所有水果出现的次数,并且求出大家最喜欢吃的前k种水果。
#include<iostream>
#include<stdlib.h>
#include<vector>
#include <string>
#include<map>
#include<algorithm>
using namespace std;
void GetFirst_K_Fruit(const vector<string> &fruit,size_t k)
{
map<string, int> fruit_count;//记录水果及其数量
//=============效率低,每次插入都要遍历map==========
//for (size_t idx = 0; idx < fruit.size(); ++idx)
//{
// map<string, int>::iterator it = fruit_count.find(fruit[idx]);
// if (it != fruit_count.end())
// it->second++;
// else
// fruit_count.insert(make_pair(fruit[idx],1));
//}
//==================================================
//==================进行优化========================
//原理:map.insert()的返回值是pair<map::iterator,bool>键值对。不管是否插入成功,它都能返回当前元素的迭代器
//那么我们可以直接插入,然后对其返回值进行判断,返回值第二个参数是true,表示插入成功,为flase,表示插入失败
pair<map<string, int>::iterator, bool> ret;
for (size_t idx = 0; idx < fruit.size(); ++idx)
{
ret = fruit_count.insert(make_pair(fruit[idx], 1));
if (ret.second == false)
ret.first->second++;
}
vector<map<string, int>::iterator> v;//定义一个vector存放map的迭代器
map<string, int>::iterator it = fruit_count.begin();
while (it != fruit_count.end())
{
v.push_back(it);
it++;
}
struct Compare//仿函数,采用降序
{
bool operator ()(map<string, int>::iterator it1, map<string, int>::iterator it2)
{
return it1->second > it2->second;
}
};
sort(v.begin(), v.end(),Compare());
for (size_t idx = 0; idx < k; ++idx)
{
cout << v[idx]->first << " ";
}
cout << endl;
}
int main()
{
vector<string> v1 = {"apple", "orange", "banana", "orange",
"strawberry", "watermelon", "apple", "orange",
"banana", "orange", "strawberry", "watermelon",
"strawberry", "watermelon" ,"pear","straberry"};
GetFirst_K_Fruit(v1, 3);
system("pause");
return 0;
}
上一篇: 自定义markdown编辑器