统计水果出现的次数及求出前K中出现次数最多的水果
2017-08-06 17:56
169 查看
函数原型
void GetFavoriteFruit(const vector& fruits,size_t k);
统计次数
第一种方法
第二种方法
找出前k种
1.排序
2.利用堆是实现(建小堆)
3 优先级队列
优先级队列每次查找或删除的元素都是权值最大或优先级最高的。
void GetFavoriteFruit(const vector& fruits,size_t k);
统计次数
//仿函数 struct Geater { bool operator()(map<string,int>::iterator l,map<string,int>::iterator r) { return (l->second) > (r->second); } };
第一种方法
map<string, int> dict; int i = 0; //统计次数 //这种先看它在不在,在的话在基础上加一,不在直接插入并把次数置为1.需要遍历2次 for (i = 0; i < fruits.size(); i++) { map<string, int>::iterator ret = dict.find(fruits[i]); if (ret != dict.end()) { ret->second++; } dict.insert(pair<string, int>(fruits[i], 1)); }
第二种方法
for (i = 0; i < fruits.size(); i++) { pair<map<string, int>::iterator, bool> ret = dict.insert(make_pair(fruits[i], 1)); if (ret.second == false) { ret.first->second++; } }
找出前k种
1.排序
vector<map<string, int>::iterator> ve; map<string, int>::iterator it = dict.begin(); while (it != dict.end()) { ve.push_back(it); it++; } sort(ve.begin(), ve.end(), Geater()); for (i = 0; i < k;i++) { cout << ve[i]->first<<":" <<ve[i]->second<< " "; } cout << endl;
2.利用堆是实现(建小堆)
//第二种方法利用堆排序,要找前k个,就可以用前k个建一个小堆,然后再插入的数比堆顶大,就往近插入,调整堆为小堆,继续插入, //直到遍历结束,这个堆中保存的数就是前k个。 for (i = 0; i < k; i++) { ve.push_back(it); it++; } make_heap(ve.begin(), ve.end(), Geater());//建一个k大小的小堆 while (it != dict.end()) { if (it->second>ve[0]->second)//如果大于堆顶,就插入重新建堆 { ve[0] = it; } it++; make_heap(ve.begin(), ve.end(), Geater()); } cout << "topk" << endl; for (i = 0; i < k; i++) { cout << ve[0]->first << ":" << ve[0]->second << endl; } }
3 优先级队列
优先级队列每次查找或删除的元素都是权值最大或优先级最高的。
template <class T, class Container = vector<T>, class Compare = less<typename Container::value_type> > class priority_queue;
struct Compare { bool operator()(map<string, int>::iterator l, map<string, int>::iterator r) { return (l->second) < (r->second); } }; priority_queue<map<string, int>::iterator, vector<map<string, int>::iterator>,Compare> q; map<string, int>::iterator it = dict.begin(); while (it != dict.end()) { q.push(it); it++; } for (i = 0; i < k; i++) { cout << q.top()->first << ":" << q.top()->second << endl; q.pop(); } }
相关文章推荐
- 面试题----统计水果出现次数最多的前三名(map的运用)
- 针对一个文件 统计其中的单词和字符数 找出文件中出现次数最多的单词数 将文件中出现的单词按频率进行排序并输出
- C++ 实现从0~100中随机生成50个数,统计出现的数字最大值和最小值,输出出现最多的次数及对应的数字
- 去除数组中重复项,并统计重复出现次数最多的元素及重复次数
- 上千万或上亿数据(有重复),统计其中出现次数最多的N个数据. C++实现
- 统计字符串中字母出现的次数并打印最多的字母----C语言练习题
- 判断一个字符串中出现次数最多的字符,统计这个次数
- 统计文件中出现次数最多的前10个单词
- Linux命令经典面试题:统计文件中出现次数最多的前10个单词
- 【二叉树】二分查找树,中序遍历,统计出现次数最多的节点【Add to List 501. Find Mode in Binary Search Tree】
- Trick(十二)——统计 label(序列)各个标签值出现的次数以及出现次数最多的标签
- 搜索出字符串中出现次数最多的字符,并统计次数
- 统计数组中出现次数最多的元素并输出
- c语言统计字符数(判断a-z哪个字符出现次数最多)
- 前端试题-js判断字符串中出现次数最多的字符及统计次数
- 统计字符数判断一个由a~z这26个字符组成的字符串中哪个字符出现的次数最多。
- 有一个文件ip.txt,每行一条ip记录,共若干行,下面哪个命令可以实现“统计出现次数最多的前3个ip及其次数”?
- 请编写相关函数来完成对一段英文字符串进行字母统计功能,出现最多那个字母的出现次数,不区分大小写。
- 随机生成长度为100的数组,数组元素为1到10,统计出现次数最多和最少的元素
- JS——统计字符串中出现次数最多的字符