面试题--本公司现在要给公司员工发波福利,在员工工作时间会提供大量的水果供员工补充营养。由于水果种类比较多,但是却又不知道哪种水果比较受欢迎,然后公司就让每个员工报告了自己最爱吃的k种水果

本文主要是介绍面试题--本公司现在要给公司员工发波福利,在员工工作时间会提供大量的水果供员工补充营养。由于水果种类比较多,但是却又不知道哪种水果比较受欢迎,然后公司就让每个员工报告了自己最爱吃的k种水果,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本公司现在要给公司员工发波福利,在员工工作时间会提供大量的水果供员工补充营养。由于水果种类比较多,但是却又不知道哪种水果比较受欢迎,然后公司就让每个员工报告了自己最爱吃的k种水果,并且告知已经将所有员工喜欢吃的水果存储于一个数组中。然后让我们统计出所有水果出现的次数,并且求出大家最喜欢吃的前k种水果。

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

思路一:
排序,但是我们又不知道有多少种水果,如果水果很多。排序将会带来很大的时间复杂度和空间复杂度。

那么,这道题应该怎么做呢?
当然,首选的应该是红黑树了,并且需要的是K/V结构的红黑树,K来存储水果的名称,V来存储这个水果出现的次数。
可是红黑树结构复杂,在面试的时候想写出来不是那么容易,所以这里有了STL两个容器,map和set。
set和map这两个容器的底层都是用红黑树来实现的,并且他们都具有防冗余的特性(被插入的数据如果在容器中已经出现,那么插入失败),他两的唯一区别就是set是一个K结构,而map是一个K/V结构。

map原型:

template < class Key,                                     class T,                                         class Compare = less<Key>,                     class Alloc = allocator<pair<const Key,T> >    > class map;  

Key:这个就是我刚才说的K/V结构中的K
T:这是K/V结构中的V。
Compare:这是一个接受仿函数类型的参数,可以控制map是一个升序的还是降续的(不传这个参数时,默认是升序)。
Alloc:空间配置器。

那么这个题该怎么解决?
定义一个map,然后将数组中所有的元素插入到map中,在插入前先使用find()来查找存在不存在,如果不存在则插入,如果存在,则利用find返回值来对找到的元素的V进行+1操作。(其中fruits是水果数组)

map<string, int> fruitCount;//创建map对象  
for (int i = 0; i < sizeof(fruits) / sizeof(fruits[0]); ++i)  
{  map<string, int>::iterator it = fruitCount.find(fruits[i]);//创建map迭代器  if (it != fruitCount.end())//先查找看该字符数组内是否存在该字符串  {  it->second++;//给该类对象的计数+1   }  else  {  fruitCount.insert(pair<string, int>(fruits[i], 1));  }  
}  

缺点:如果map中没有要插入的这个水果,则需要遍历两次map。

思路二:只遍历一次map
insert的返回值pair。既然不管是否插入成功,它都能返回我们需要的这个元素的迭代器。那么,我们可以先插入,然后对其返回值进行保存,如果该返回值得第二个参数是true,表示插入成功,不进行其他操作,如果为flase,表示插入失败,那么其返回的第一个参数将会带回已经存在的这个被插入元素的迭代器,当然轻而易举就可以通过迭代器拿到这个元素的第二个参数V。

void CalculateFruitCount(map<string,int>& m, string fruits[], size_t size)  
{  for (size_t i = 0; i < size; i++)  {  //m[fruits[i]]++;    //map中有operator[]的重载,其内容等同于下边代码  pair<map<string, int>::iterator, bool> ret;  ret = m.insert(make_pair(fruits[i], 1));  if (ret.second == false)  ret.first->second++;  }  
}  

现在走到这里已经全部插入了,那接下来我们就需要找前K个最喜欢的水果了。

思路一:
将统计好的数据全部放入一个vector中,并且利用排序算法sort进行排序。而其默认为升序,最大的则位于数组后边,但是我们并不知道vector有多大。所以,我们采用降续,这样最大的永远在vector的前列.

void GetBeginOfThreeFruits(map<string, int>& m, vector<map<string, int>::iterator>& v)  //按照水果出现的次数降续存储于v中  
{  map<string, int>::iterator it = m.begin();  while (it != m.end())  {  v.push_back(it);  it++;  }  struct Compare   //仿函数(降续)  {  bool operator()(map<string, int>::iterator l, map<string, int>::iterator r)  {  return l->second > r->second;  }  };  sort(v.begin(), v.end(),Compare());  
}  

思路二:给一个堆,这个堆只要K个大小。
因为找出现次数最多的,所以这里给一个小堆。堆顶元素为最小的数。每一次新进来的数字和堆顶比较,如果比堆顶小则不要。比堆顶大则把堆顶pop,把这个元素插入再重新排堆。

void GetBeginOfNFruits(map<string, int>& m, size_t n, vector<map<string,int>::iterator>& v)  
{  map<string, int> ::iterator it = m.begin();  for (size_t i = 0; i < n; ++i)  {  v.push_back(it);  it++;  }  struct Compare  //堆算法默认是大堆,此处需要仿函数将其改为小堆  {  bool operator()(map<string, int>::iterator l, map<string, int>::iterator r)  {  return l->second > r->second;  //小堆  }  };  make_heap(v.begin(), v.end(), Compare());  while (it != m.end())  {  if (it->second > v.front()->second)  {  pop_heap(v.begin(), v.end(), Compare());  v.pop_back();  v.push_back(it);  push_heap(v.begin(), v.end(), Compare());  }  it++;  }  
}  

这篇关于面试题--本公司现在要给公司员工发波福利,在员工工作时间会提供大量的水果供员工补充营养。由于水果种类比较多,但是却又不知道哪种水果比较受欢迎,然后公司就让每个员工报告了自己最爱吃的k种水果的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/320513

相关文章

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

荣耀嵌入式面试题及参考答案

在项目中是否有使用过实时操作系统? 在我参与的项目中,有使用过实时操作系统。实时操作系统(RTOS)在对时间要求严格的应用场景中具有重要作用。我曾参与的一个工业自动化控制项目就采用了实时操作系统。在这个项目中,需要对多个传感器的数据进行实时采集和处理,并根据采集到的数据及时控制执行机构的动作。实时操作系统能够提供确定性的响应时间,确保关键任务在规定的时间内完成。 使用实时操作系统的

一些其他面试题

阿里二面:那你来说说定时任务?单机、分布式、调度框架下的定时任务实现是怎么完成的?懵了。。_哔哩哔哩_bilibili 1.定时算法 累加,第二层每一个格子是第一层的总时间400 ms= 20 * 20ms 2.MQ消息丢失 阿里二面:高并发场景下引进消息队列有什么问题?如何保证消息只被消费一次?真是捏了一把汗。。_哔哩哔哩_bilibili 发送消息失败

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

工作常用指令与快捷键

Git提交代码 git fetch  git add .  git commit -m “desc”  git pull  git push Git查看当前分支 git symbolic-ref --short -q HEAD Git创建新的分支并切换 git checkout -b XXXXXXXXXXXXXX git push origin XXXXXXXXXXXXXX

音视频入门基础:WAV专题(10)——FFmpeg源码中计算WAV音频文件每个packet的pts、dts的实现

一、引言 从文章《音视频入门基础:WAV专题(6)——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道,通过FFprobe命令可以打印WAV音频文件每个packet(也称为数据包或多媒体包)的信息,这些信息包含该packet的pts、dts: 打印出来的“pts”实际是AVPacket结构体中的成员变量pts,是以AVStream->time_base为单位的显

嵌入式方向的毕业生,找工作很迷茫

一个应届硕士生的问题: 虽然我明白想成为技术大牛需要日积月累的磨练,但我总感觉自己学习方法或者哪些方面有问题,时间一天天过去,自己也每天不停学习,但总感觉自己没有想象中那样进步,总感觉找不到一个很清晰的学习规划……眼看 9 月份就要参加秋招了,我想毕业了去大城市磨练几年,涨涨见识,拓开眼界多学点东西。但是感觉自己的实力还是很不够,内心慌得不行,总怕浪费了这人生唯一的校招机会,当然我也明白,毕业