1、问题

本公司现在要给公司员工发波福利,在员工工作时间会提供大量的水果供员工补充营养。由于水果种类比较多,但是却又不知道

哪种水果比较受欢迎,然后公司就让每个员工报告了自己最爱吃的k种水果,并且告知已经将所有员工喜欢吃的水果存储于一个数组中。

然后让我们统计出所有水果出现的次数,并且求出大家最喜欢吃的前k种水果。

void GetFavoriteFruit(const vector& fruits,size_t k);

ps:要求打印出最喜欢的水果,并且效率尽可能的高。

提示:尽量STL的容器和算法,这样能更快速高效的实现。

2、问题分析:

已知一个vector fruits存放每个员工填写的自己喜欢的k种水果。

(1)首先要遍历该vector,统计出每种水果的数量。可以借助STL容器中的map<水果,水果count>;

(2)排序,找最前k种水果,

<1>用STL中的优先级队列

#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <stdlib.h>
//#include <algorithm>
#include <queue>using namespace std;void GetFavoriteFruit(const vector<string>& fruits, size_t k)
{//统计各种水果的个数map<string, int> fruits_count;for (int i = 0; i < fruits.size(); ++i){fruits_count[fruits[i]]++;}//排序,找最前k种水果struct Compare  //函数对象,堆中的元素比较的方式{bool operator()(map<string, int>::iterator it1, map<string, int>::iterator it2){return it1->second < it2->second;}};//优先级队列(大堆),type,container(不能为list),compare,默认是 <priority_queue<map<string, int>::iterator, vector<map<string, int>::iterator>, Compare> q;map<string, int>::iterator it = fruits_count.begin();while (it != fruits_count.end()){q.push(it);++it;}for (int i = 0; i < k; ++i){cout <<q.top()->first << "  : "<< q.top()->second << endl;q.pop();}
}

<2>最大堆

#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <stdlib.h>
#include <algorithm>using namespace std;
//使用堆
void GetFavoriteFruit(const vector<string>& fruits, size_t k)
{//统计水果数量map<string, int> fruits_count;/*原理:map.insert()的返回值是pair<map::iterator,bool>键值对。不管是否插入成功,它都能返回当前元素的迭代器那么我们可以直接插入,然后对其返回值进行判断,返回值第二个参数是true,表示插入成功,为flase,表示插入失败*/pair<map<string, int>::iterator, bool> ret;for(size_t i = 0; i < fruits.size(); i++){ret = fruits_count.insert(make_pair(fruits[i], 1));if(ret.second == false)ret.first->second++;}vector<map<string, int>::iterator> v;map<string, int>::iterator it = fruits_count.begin();while(it != fruits_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; }};make_heap(v.begin(), v.end(),Compare());//找出大堆中的前k个vector<map<string, int>::iterator>::iterator iter = v.begin();for(size_t i = 0; i < k; i++){cout<<(*iter)->first<<" : "<<(*iter)->second<<endl;pop_heap(v.begin(), v.end(),Compare());v.pop_back();}
}

将map存放到vector中进行sort排序,

#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <stdlib.h>
#include <algorithm>using namespace std;
//使用sort排序
void GetFavoriteFruit(const vector<string>& fruits, size_t k)
{//统计水果数量map<string, int> fruits_count;for(size_t i = 0; i < fruits.size(); i++){fruits_count[fruits[i]]++;}vector<map<string, int>::iterator> v;map<string, int>::iterator it = fruits_count.begin();while(it != fruits_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 i = 0; i < k; i++){cout<<v[i]->first<<" : "<<v[i]->second<<endl;}
}

set(也可用来排序,但是会去掉重复,故有缺陷:比如两种水果被选次数相同,会忽略掉一种,打印数量相对更少的)

#include <iostream>
#include <set>
#include <map>
#include <string>
#include <stdlib.h>
#include <vector>using namespace std;void GetFavoriteFruit(const vector<string>& fruits, size_t k)
{//统计各种水果的个数map<string, int> fruits_count;for (int i = 0; i < fruits.size(); ++i){fruits_count[fruits[i]]++;}struct Compare  //函数对象,堆中的元素比较的方式{bool operator()(map<string, int>::iterator it1, map<string, int>::iterator it2){return it1->second > it2->second;}};set<map<string, int>::iterator, Compare> s;map<string, int>::iterator it = fruits_count.begin();while (it != fruits_count.end()){s.insert(it);++it;}//set<map<string, int>::iterator, Compare>::iterator ite = s.begin();int count = 0;while (ite != s.end() && count < k){cout << (*ite)->first << " :" << (*ite)->second << endl;++ite;++count;}
}

面试题:找出公司员工最喜欢的k种水果相关推荐

  1. 《数据库SQL实战》找出所有员工当前薪水salary情况

    题目描述:找出所有员工当前(to_date='9999-01-01')具体的薪水salary情况,对于相同的薪水只显示一次,并按照逆序显示 CREATE TABLE salaries ( emp_no ...

  2. SQL实战之找出所有员工当前薪水salary情况

    题目描述 找出所有员工当前(to_date='9999-01-01')具体的薪水salary情况,对于相同的薪水只显示一次,并按照逆序显示 CREATE TABLE salaries ( emp_no ...

  3. Excel通过上下班打卡时间做差找出缺勤员工

    今天小编要和大家分享的是,Excel通过上下班打卡时间做差找出缺勤员工的操作 (方方格子插件) 1.先看动图演示吧 2.我们打开表格后,需要选择公式向导按钮 3.然后选择时间差操作 4.弹出界面后首先 ...

  4. python3数据分析面试题--找出出现次数最多的名字并统计次数

    前段时间有一个朋友说遇到一个数据分析的面试题,今天来和大家分享一下. 题目是这样的:有一个姓名列表,列表中有很多名字,且有些名字是重复的,要求是找出出现次数最多的名字,以及出现的次数. 上代码: fr ...

  5. 被虎牙HR抬出公司员工发声

    11月7日消息,"虎牙员工自曝被HR抬出公司"的话题登上热搜,引发不少网友关注. 据报道,这名员工称其遭受直系领导的冷暴力导致抑郁,现被公司暴力辞退. 在拒绝签署辞退书后,HR带着 ...

  6. 算法试题 - 找出最小 k 个数

    题目 题目:输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,. 解析 思路1 这一题应用堆排序算法复杂度只有O(nlog k), ...

  7. 算法试题 - 找出字符流中第一个不重复的元素

    题目 题目:请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时, 第一个只出现一次的字符是"g".当从该字符流中 ...

  8. 【菜鸡新手 - 剑指offer 03】[2021/1/17一刷] 找出数组中重复的数字 -三种解法|| 物归原主,测试碰撞法 || hash表测试碰撞法 || 排序+遍历法 ||python

    文章目录 题目解读 A. 书籍推荐解法:我起名为" 物归原主,测试碰撞"法 B. 基础尝试1:hash表 + 碰撞测试 (效果还行) C. 基础尝试2:排序+遍历 (效果差) C. ...

  9. 找出无序数组中最小的k个数(top k问题)

    2019独角兽企业重金招聘Python工程师标准>>> 给定一个无序的整型数组arr,找到其中最小的k个数 该题是互联网面试中十分高频的一道题,如果用普通的排序算法,排序之后自然可以 ...

最新文章

  1. Android系统Google Maps开发实例浅析
  2. 数据库查询 添加伪列
  3. Atitit. 软件GUIbutton与仪表盘--webserver区--获取apache配置文件路径 linux and apache的启动、停止、重新启动...
  4. OpenStack云计算口袋书-第一章-开始OpenStack之旅(一)
  5. android listview 数据同步,android中ListView数据刷新时的同步方法
  6. leetcode350. 两个数组的交集 II
  7. 小林求职记(二):说好的问基础,为啥我感觉一点也不基础呢?
  8. 李宏毅机器学习——结构化学习(一)
  9. .Net Core[译文]
  10. 基于asp.net806莆田新华网上书店_图书销售系统
  11. win10下装黑苹果双系统
  12. it企业实习_IT公司实习报告总结
  13. c语言薛定谔方程,如何解薛定谔方程?-- k · p method
  14. 室外用计算机,室外气候计算工具
  15. android gif 解帧,动图GIF制作
  16. 华为softco直接用语音服务器注册IMS返回403错误代码
  17. gensim基本使用+文本相似度分析
  18. 数据存储单位的换算单位
  19. 用Python绘制分子结构
  20. 论文全免费下载网站SCI-Hub新网址

热门文章

  1. 【bzoj1565】[NOI2009]植物大战僵尸 【网络流】【最大权闭合子图】
  2. 01_jeecms建站
  3. [codevs1039]数的划分
  4. 知识点滴:持久层,DAO,API,DAL,BLL,DLL,csproj,sln
  5. Gnuplot 简单使用
  6. 浅谈jQuery的选择器
  7. 3个Gmail 邀请,先进先出!!
  8. 从全栈式解决方案到情感化,揭秘问众智能切入车载语音市场的最佳姿势...
  9. bind简单转发实验
  10. 在 PowerPoint 2016 中嵌入网页