欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

最受欢迎的前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;
}