水果笔试题

本文主要探讨了在招聘过程中出现的一类特殊笔试题——水果类题目,这类题目通常用于考察应聘者的逻辑思维、问题解决和创新能力。
摘要由CSDN通过智能技术生成

水果笔试题

题目:本公司现在要给公司员工发波福利,在员工工作时间会提供大量的水果供员工补充营养。由于水果种类比较多,但是却又不知道哪种水果比较受欢迎,然后公司就让每个员工报告了自己最爱吃的k种水果,并且告知已经将所有员工喜欢吃的水果存储于一个数组中。然后让我们统计出所有水果出现的次数,并且求出大家最喜欢吃的前k种水果。 
ps:要求打印出最喜欢的水果,并且效率尽可能的高。 提示:尽量STL的容器和算法,这样能更快速高效的实现。

问题分析:我们可能第一反应就是将数组遍历一遍再排序,如果该公司的人员很多,那么对数组进行遍历并排序将会有很大的开销,而且时间复杂度和空间复杂度都很高,显然这种方法不合理。
因此,我们可以选择红黑树,并且是K/V结构的红黑树,K来存储水果的名称,V来存储水果的出现次数。可以选择用STL库中的两个关联式容器:set和map
set和map这两个容器的底层都是用红黑树来实现的,他们都有防冗余的特性(被插入的数据如果在容器中出现,则插入失败),他两的区别是set是一个K结构,而map是一个K/V结构。
关于map介绍:

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

 首先其返回值是一个pair,什么是pair:一个结构体,第一个参数是一个迭代器,第二个参数数一个bool值。意思就是:如果插入成功,就返回一个被插入元素的迭代器,并且第二个参数为true;反之返回容器中已经存在的这个和被插入元素相同的元素的迭代器和false.

要想统计出水果中的前k种,首先需要统计出各种水果出现的次数。按照降序排列再拿出前k个出现的水果。
 第一步:关于统计出各种水果的次数的方法利用map有如下几种:
方法一:利用map中的find再insert
map
     
     
      
       s ;//创建map对象 
	for (int i = 0; i < sizeof(strs) / sizeof(strs[0]); ++i)
	{
		map
      
      
       
       ::iterator it = s.find(strs[i]);//创建map迭代器  
		if (it != s.end())//先查找看该字符数组内是否存在该字符串  
		{
			(*it).second++;//给该类对象的计数+1或  
			it->second++;  
		}
		else
		{
			s.insert(pair
       
       
        
        (strs[i], 1));
		}
	}
       
       
      
      
     
     
方法二:直接利用insert
void CalculateFruitCount(map
     
     
      
      & m, string s[], size_t size)
{
	for (size_t i = 0; i < size; i++)
	{
		p
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值