面试题:找出公司员工最喜欢的k种水果
1、問(wèn)題
本公司現(xiàn)在要給公司員工發(fā)波福利,在員工工作時(shí)間會(huì)提供大量的水果供員工補(bǔ)充營(yíng)養(yǎng)。由于水果種類比較多,但是卻又不知道
哪種水果比較受歡迎,然后公司就讓每個(gè)員工報(bào)告了自己最愛(ài)吃的k種水果,并且告知已經(jīng)將所有員工喜歡吃的水果存儲(chǔ)于一個(gè)數(shù)組中。
然后讓我們統(tǒng)計(jì)出所有水果出現(xiàn)的次數(shù),并且求出大家最喜歡吃的前k種水果。
void GetFavoriteFruit(const vector& fruits,size_t k);
ps:要求打印出最喜歡的水果,并且效率盡可能的高。
提示:盡量STL的容器和算法,這樣能更快速高效的實(shí)現(xiàn)。
2、問(wèn)題分析:
已知一個(gè)vector fruits存放每個(gè)員工填寫(xiě)的自己喜歡的k種水果。
(1)首先要遍歷該vector,統(tǒng)計(jì)出每種水果的數(shù)量。可以借助STL容器中的map<水果,水果count>;
(2)排序,找最前k種水果,?
<1>用STL中的優(yōu)先級(jí)隊(duì)列
#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) {//統(tǒng)計(jì)各種水果的個(gè)數(shù)map<string, int> fruits_count;for (int i = 0; i < fruits.size(); ++i){fruits_count[fruits[i]]++;}//排序,找最前k種水果struct Compare //函數(shù)對(duì)象,堆中的元素比較的方式{bool operator()(map<string, int>::iterator it1, map<string, int>::iterator it2){return it1->second < it2->second;}};//優(yōu)先級(jí)隊(duì)列(大堆),type,container(不能為list),compare,默認(rèn)是 <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) {//統(tǒng)計(jì)水果數(shù)量map<string, int> fruits_count;/*原理:map.insert()的返回值是pair<map::iterator,bool>鍵值對(duì)。不管是否插入成功,它都能返回當(dāng)前元素的迭代器那么我們可以直接插入,然后對(duì)其返回值進(jìn)行判斷,返回值第二個(gè)參數(shù)是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個(gè)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中進(jìn)行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) {//統(tǒng)計(jì)水果數(shù)量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(也可用來(lái)排序,但是會(huì)去掉重復(fù),故有缺陷:比如兩種水果被選次數(shù)相同,會(huì)忽略掉一種,打印數(shù)量相對(duì)更少的)
#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) {//統(tǒng)計(jì)各種水果的個(gè)數(shù)map<string, int> fruits_count;for (int i = 0; i < fruits.size(); ++i){fruits_count[fruits[i]]++;}struct Compare //函數(shù)對(duì)象,堆中的元素比較的方式{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;} }
總結(jié)
以上是生活随笔為你收集整理的面试题:找出公司员工最喜欢的k种水果的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: php 如何查询数组,php
- 下一篇: 程序开发剖解圣经(006)