百度软件工程师笔试题和面试题答案大全(4)

更新时间:2018-11-22 15:54作者:三水老师

      14、设计DNS服务器中cache的数据结构。

      要求设计一个DNS的Cache结构,要求能够满足每秒5000以上的查询,满足IP数据的快速插入,查询的速度要快。(题目还给出了一系列的数据,比如:站点数总共为5000万,IP地址有1000万,等等)

      回答:

      DNS服务器实现域名到IP地址的转换。

      每个域名的平均长度为25个字节(估计值),每个IP为4个字节,所以Cache的每个条目需要大概30个字节。

      总共50M个条目,所以需要1.5G个字节的空间。可以放置在内存中。(考虑到每秒5000次操作的限制,也只能放在内存中。)

      可以考虑的数据结构包括hash_map,字典树,红黑树等等。

      15、找出给定字符串对应的序号。

      序列Seq=[a,b,…z,aa,ab…az,ba,bb,…bz,…,za,zb,…zz,aaa,…]类似与excel的排列,任意给出一个字符串s=[a-z]+(由a-z字符组成的任意长度字符串),请问s是序列Seq的第几个。

      回答:

      注意到每满26个就会向前进一位,类似一个26进制的问题。

      比如ab,则位置为26*1+2;

      比如za,则位置为26*26+1;

      比如abc,则位置为26*26*1+26*2+3;

      16、找出第k大的数字所在的位置。写一段程序,找出数组中第k大小的数,输出数所在的位置。例如{2,4,3,4,7}中,第一大的数是7,位置在4。第二大、第三大的数都是4,位置在1、3随便输出哪一个均可。

      答案:

      先找到第k大的数字,然后再遍历一遍数组找到它的位置。所以题目的难点在于如何最高效的找到第k大的数。

      我们可以通过快速排序,堆排序等高效的排序算法对数组进行排序,然后找到第k大的数字。这样总体复杂度为O(NlogN)。

      我们还可以通过二分的思想,找到第k大的数字,而不必对整个数组排序。从数组中随机选一个数t,通过让这个数和其它数比较,我们可以将整个数组分成了两部分并且满足,{x,xx,...,t}<{y,yy,...}。

      在将数组分成两个数组的过程中,我们还可以记录每个子数组的大小。这样我们就可以确定第k大的数字在哪个子数组中。

      然后我们继续对包含第k大数字的子数组进行同样的划分,直到找到第k大的数字为止。

      平均来说,由于每次划分都会使子数组缩小到原来1/2,所以整个过程的复杂度为O(N)。

      17、给40亿个不重复的unsigned int的整数,没排过序的,然后再给几个数,如何快速判断这几个数是否在那40亿个数当中?

      答案:

      unsigned int的取值范围是0到2^32-1。我们可以申请连续的2^32/8=512M的内存,用每一个bit对应一个unsigned int数字。首先将512M内存都初始化为0,然后每处理一个数字就将其对应的bit设置为1。当需要查询时,直接找到对应bit,看其值是0还是1即可。

      18、在一个文件中有10G个整数,乱序排列,要求找出中位数。内存限制为2G。

      回答:

      不妨假设10G个整数是64bit的。

      2G内存可以存放256M个64bit整数。

      我们可以将64bit的整数空间平均分成256M个取值范围,用2G的内存对每个取值范围内出现整数个数进行统计。这样遍历一边10G整数后,我们便知道中数在那个范围内出现,以及这个范围内总共出现了多少个整数。

      如果中数所在范围出现的整数比较少,我们就可以对这个范围内的整数进行排序,找到中数。如果这个范围内出现的整数比较多,我们还可以采用同样的方法将此范围再次分成多个更小的范围(256M=2^28,所以最多需要3次就可以将此范围缩小到1,也就找到了中数)。

      19、时分秒针在一天之类重合多少次?(24小时)

      2次

      而时针和分针重合了22次。

      20、将多个集合合并成没有交集的集合。

      给定一个字符串的集合,格式如:{aaabbbccc},{bbbddd},{eeefff},{ggg},{dddhhh}要求将其中交集不为空的集合合并,要求合并完成后的集合之间无交集,例如上例应输出{aaabbbcccdddhhh},{eeefff},{ggg}。

      (1)请描述你解决这个问题的思路;

      (2)请给出主要的处理流程,算法,以及算法的复杂度

      (3)请描述可能的改进。

      回答:

      集合使用hash_set来表示,这样合并时间复杂度比较低。

      1、给每个集合编号为0,1,2,3...

      2、创建一个hash_map,key为字符串,value为一个链表,链表节点为字符串所在集合的编号。遍历所有的集合,将字符串和对应的集合编号插入到hash_map中去。

      3、创建一个长度等于集合个数的int数组,表示集合间的合并关系。例如,下标为5的元素值为3,表示将下标为5的集合合并到下标为3的集合中去。开始时将所有值都初始化为-1,表示集合间没有互相合并。在集合合并的过程中,我们将所有的字符串都合并到编号较小的集合中去。

      遍历第二步中生成的hash_map,对于每个value中的链表,首先找到最小的集合编号(有些集合已经被合并过,需要顺着合并关系数组找到合并后的集合编号),然后将链表中所有编号的集合都合并到编号最小的集合中(通过更改合并关系数组)。

      4、现在合并关系数组中值为-1的集合即为最终的集合,它的元素来源于所有直接或间接指向它的集合。

      算法的复杂度为O(n),其中n为所有集合中的元素个数。

      题目中的例子:

      0:{aaabbbccc}

      1:{bbbddd}

      2:{eeefff}

      3:{ggg}

      4:{dddhhh}

      生成的hash_map,和处理完每个值后的合并关系数组分别为

      aaa:0。[-1,-1,-1,-1,-1]

      bbb:0,1。[-1,0,-1,-1,-1]

      ccc:0。[-1,0,-1,-1,-1]

      ddd:1,4。[-1,0,-1,-1,0]

      eee:2。[-1,0,-1,-1,0]

      fff:2。[-1,0,-1,-1,0]

      ggg:3。[-1,0,-1,-1,0]

      hhh:4。[-1,0,-1,-1,0]

      所以合并完后有三个集合,第0,1,4个集合合并到了一起,

    为您推荐

    2019年两会《政府工作报告》养老金新政策,要提高养老保障水平

    《关于2018年中央和地方预算执行情况与2019年中央和地方预算草案的报告》要求,提高养老保障水平。从2019年1月1日起,按平均约5%的幅度提高企业和机关事业单位退休人员基本养老金标准。

    2019-06-13 04:57

    如何在另类面试问题中胜出

    在面试中,有些考官会先提一个不甚友好的问题,或者劈头浇你一盆冷水,让你在委屈和激愤中露出本色。在他看来,击溃你的心理防线,才能筛选出有心理承受能力的智者,找到能面对压力的新鲜血液。要想在压力面试中胜出,只能学会绕开陷阱,奋战到底。

    2019-06-08 03:00

    面试紧张时应该怎么办

    面试是进入公职机关的最后一道主要的门槛,因此可以说每一位进入面试的人,心里就像绷住一根弦一样,也就是说每位考生,都会以高度的精神状态去抓住这次进入角色的机会。出现紧张、焦虑的心情也是不可避免的,只有认识了解,才能完全的克服。

    2019-06-08 02:58

    面对变故 学会自我解嘲

    面对降级、减薪、甚至解雇、离婚、丧子等变故,许多人反应过度,很长时间缓不过劲儿来。而有的人却能很快度过,重返正常的生活轨道。其决定因素是一种特殊的心理素质:心理复原力。有了它,人们不怕挫折;而缺少它,会特别害怕受伤害,不敢付出行动。

    2019-06-06 03:12

    办公室里该与不该谈论的话题

    办公室是一个充满原则、纪律,讲求策略的场合,更是一个充满利益冲突的是非之所。既如此,办公室里谈个人私事是否妥当呢?网上调查显示,尽管九成以上的人认为“办公室里隐私不宜说”,但是她/他们又同时承认有在办公室里谈论涉及私人感情、家庭关系、同事喜恶和上下级关系等隐私性内容的行为。

    2019-06-06 03:10

    面试自我介绍的几大原则

    应聘到外企或其他用人单位时,求职者往往最先被问及的问题就是“请先介绍介绍你自己”。这个问题看似简单,但求职者一定要慎重对待,它是你突出优势和特长,展现综合素质的好机会。回答得好,会给人留下良好的第一印象。

    2019-06-01 03:19

    外企面试必须要注意的五“必要”

    到外企面试前,仅仅准备好一份简历是不够的,还要提前做好面试前的“功课”,这样面试通过的几率就会大大增加。

    2019-06-01 03:16

    加载中...