百度面试试题集锦
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、算法设计
1、设rand(s,t)返回[s,t]之间的随机小数,利用该函数在一个半径为R的圆内找随机n 个点,并给出时间复杂度分析。
思路:这个使用数学中的极坐标来解决,先调用[s1,t1]随机产生一个数r,归一化后乘以半径,得到R*(r-s1)/(t1-s1),然后在调用[s2,t2]随机产生一个数a,归一化后得到角度:360*(a-s2)/(t2-s2)
2、为分析用户行为,系统常需存储用户的一些query,但因query非常多,故系统不能全存,设系统每天只存m个query,现设计一个算法,对用户请求的query进行随机选择m个,请给一个方案,使得每个query被抽中的概率相等,并分析之,注意:不到最后一刻,并不知用户的总请求量。
思路:如果用户查询的数量小于m,那么直接就存起来。
如果用户查询的数量大于m,假设为m+i,那么在1-----m+i之间随机产生一个数,如果选择的是前面m条查询进行存取,那么概率为m/(m+i),如果选择的是后面i条记录中的查询,那么用这个记录来替换前面m 条查询记录的概率为m/(m+i)*(1-1/m)=(m-1)/(m+i),当查询记录量很大的时候,m/(m+i)== (m-1)/(m+i),所以每个query被抽中的概率是相等的。
3、C++ STL中vector的相关问题:(1)、调用push_back时,其内部的内存分配是如何进行的?(2)、调用clear时,内部是如何具体实现的?若想将其内存释放,该如何操作?vector的工作原理是系统预先分配一块CAPACITY大小的空间,当插入的数据超过这个空间的时候,这块空间会让某种方式扩展,但是你删除数据的时候,它却不会缩小。
vector为了防止大量分配连续内存的开销,保持一块默认的尺寸的内存,clear只是清数据了,未清内存,因为vector的capacity容量未变化,系统维护一个的默认值。
有什么方法可以释放掉vector中占用的全部内存呢?
标准的解决方法如下
template < class T >
void ClearVector( vector< T >& vt ) { vector< T > vtTemp; veTemp.swap( vt ); } 事实上,vector根本就不管内存,它只是负责向内存管理框架acquire/release内存,内存管理框架如果发现内存不够了,就malloc,但是当vector释放资源的时候(比如destruct), stl根本就不调用free以减少内存,因为内存分配在stl的底层:stl假定如果你需要更多的资源就代表你以后也可能需要这么多资源(你的list, hashmap也是用这些内存),所以就没必要不停地malloc/free。
如果是这个逻辑的话这可能是个trade-off 一般的STL内存管理器allocator都是用内存池来管理内存的,所以某个容器申请内存或释放内存都只是影响到内存池的剩余内存量,而不是真的把内存归还给系统。
这样做一是为了避免内存碎片,二是提高了内存申请和释放的效率——不用每次都在系统内存里寻找一番。
二、系统设计
正常用户端每分钟最多发一个请求至服务端,服务端需做一个异常客户端行为的过滤系统,设服务器在某一刻收到客户端A的一个请求,则1分钟内的客户端任何其它请求都需要被过滤,现知每一客户端都有一个IPv6地址可作为其ID,客户端个数太多,以至于无法全部放到单台服务器的内存hash表中,现需简单设计一个系统,使用支持高效的过滤,可使用多台机器,但要求使用的机器越少越好,请将关键的设计和思想用图表和代码表现出来。
三、求一个全排列函数:如p([1,2,3])输出: [123]、[132]、[213]、[231]、[321]、[312] 求一个组合函数。
方法1:依次从字符串中取出一个字符作为最终排列的第一个字符,对剩余字符组成的字符串生成全排列,最终结果为取出的字符和剩余子串全排列的组合。
优点:该方法易于理解,但无法移除重复的排列,如:s="ABA",会生成两个“AAB”。
方法2:利用交换的思想,具体见实例,但该方法不如方法1容易理解。
我们以三个字符abc为例来分析一下求字符串排列的过程。
首先我们固定第一个字符a,求后面两个字符bc的排列。
当两个字符bc的排列求好之后,我们把第一个字符a和后面的b交换,得到bac,接着我们固定第一个字符b,求后面两个字符ac的排列。
现在是把c放到第一位置的时候了。
记住前面我们已经把原先的第一个字符a和后面的b做了交换,为了保证这次c仍然是和原先处在第一位置的a 交换,我们在拿c和第一个字符交换之前,先要把b和a交换回来。
在交换b和a之后,再拿c和处在第一位置的a进行交换,得到cba。
我们再次固定第一个字符c,求后面两个字符b、a的排列。
既然我们已经知道怎么求三个字符的排列,那么固定第一个字符之后求后面两个字符的排列,就是典型的递归思路了。
基于前面的分析,我们可以得到如下的参考代码:如p([1,2,3])输出: [1]、[2]、[3]、[1,2]、[2,3]、[1,3]、[1,2,3] 这两问可以用伪代码。
北京产品设计笔试
纯文科背景,很简单的互联网产品经验,报百度纯粹是志趣所在。
笔试题与大家分享,如果是真心喜欢互联网行业的同学肯定觉得题目很简单。
1. 选一个你熟悉的百度产品,针对用户体验提出改进意见。
2. 设计一个在线音乐播放器的界面并说明设计思路。
3. 设计几个指标衡量百度图片所搜的用户体验。
4. 有一个手机通讯软件的添加好友界面,评述优点和确定,平提出建议。
5. 冰箱通常带有照明灯,请说明这一设计的必要性和适用场景。
以及微波炉是否需要这一功能?为什么?
2013年百度商业业务分析笔试题
一、推理题
1、根据已有信息判断正误
All people love running
Some people love cook(类似,记不清了)
Some people look like their masters
判断下面几句话正误
比如 all people loving run love cook
People love run look like their masters 等
2、有2只红袜子、20只黄袜子,31只蓝袜子,问抽几只袜子,能确保抽到两只颜色一样的?
3、有50个红球,50个蓝球,两个罐子,随机抽取一个罐子,随机抽取一个球放入罐子,问如何能让抽到红球的概率最大?(所有球的进入罐子)在这样的设计下,球数应该增多还是减少?
4、象棋中,如果最后只剩下了将和帅,有多少种状态是没有结果的?
5、推理题
8个将军射猎,其中一个人射中了鹿,但是国王让大家猜是谁射中的,8个人每人一句话,国王说只有三个人说的是对的,问谁射中了鹿?如果五个人说的是对的,那么是谁射中的?
6、切金子问题
15cm长的金子,每天给工人1cm,三刀,如何切?若是16cm可以么?
7、一个女生想找三高男,高个子、高收入、高学历,A、B、C、D只有一个满足要求,给了几个条件:
(1) A和B收入一样
(2) C和D身高情况相反
(3)三个高个子,两个高收入,一个高学历(记不太清了,大概类似条件)
问谁是三高男?
二、选答题
1、给出一个SNS网站推荐好友功能的策略设计。
2、移动互联网与PC互联网的异同,在商业流量变现的角度看两者的优劣势,那么搜索推广如何?
3、一个研究者对于广告页面绿色对点击率影响的统计,第一页和第二页都显示绿色会增加点击率,但综合统计显示没有明显关系,请问是为什么?采用什么统计方法进行分析?
4、公交IC卡的一个问题,它不只是一个金融工具,也可以提供很多用户数据。
从公交站、广告商等角度看广告的投放?(没仔细看。
)
【面经】
百度系统工程师(基础网络)北京
有点小惊讶,三次面试竟然全部都是电话面试。
而且三次面试都是技术面试。
但是个人觉得百度的网络岗位技术面试跟其他的公司很不一样。
1.百度重视基础知识,一些类似于传统的三次握手肯定是必问
2.百度重视应用,经常是给你一个拓扑,围绕着拓扑询问。
从某个知识点出发,但是又不拘泥于这个知识点,遗憾的是这一部分掌握的不是很好
3.百度比较人性化,问你一些问题的时候会事先征求你的意见,例如问路由协议的话他会提前问你,你觉得那一块掌握的比较好。
我觉得这一块我回答的挺不错的。
4.百度重视与面试者之间的互动。
同百度的老师们沟通交流时很愉快的一件事情,因为不像
其他公司搞的那么严谨,你在回答问题的时候有很多机会可以跟老师们沟通交流。
有些方向你想歪了,面试官会温馨的提醒你。
总之有点类似于学生跟老师沟通交流某个问题时候的感觉啊。
百度上海,开发测试,三面归来
一面:
预定时间是22号下午四点。
我回去东一把数据结构,西一把算法,都不知道复习什么好了。
因为知道百度刷人刷得挺狠的,之前同学面试笔试北京百度的时候,不少都尘沙折戟了。
第二天,心情沉重的过去了,结果三点多就轮到我了。
面我的是个很阳光清爽的GG。
开始让我自我介绍,说说学校的情况,以及简历上的实验室项目和实习项目。
然后他询问了一些感兴趣的部分,以及一些项目的细节,这些不在话下。
总体说来,一面问的东西蛮多的,也蛮全面的,好像一个小时二十多分钟,时间挺长的。
包括一些常用的linux命令、网络编程(估计因为项目涉及,所以就问了)、指针、数组指针、C++内存分配、函数压栈、数据库等等。
大部分是我擅长的东西,自我感觉前面答得还不错,但是我回去之后核查了几个问题,发现有个内联函数的问题答得不太精确,难怪那位GG后来又问我宏定义的问题,好在宏定义上面没有弄错,估计那位GG以为我记得稍微模糊了点,所以放了我一马。
后面写了几个代码,如果平时在学校认真学,应该都没问题,没有传说中的那么恐怖,当然,也不排除我运气问题。
第一个是输出1-100中所有的素数;第二个是链表反转第三个是Y链表可能因为第二个代码写得不太好,指针指来指去,把自己绕晕了,然后就有点紧张,再加上当时屋子里有好几对面试的,周围一直嗡嗡的响,后来那位GG可能看出来了我的状态了,就提示了几下,终于搞定。
然后,又补问了第三个问题。
以为自己没戏了,挂在链表上了,回来路上就开始各种伤心,觉得链表逆序,那么经典基础的东西怎么可以不会呢,特别的自责,连地铁都坐过好多站。
没想到,晚上收到二面通知:22号三点。
兴奋又感激,看来那位GG看我前面回答的不错的份上,给了我第二次机会。
于是我把指针重点复习了一下,顺带着看了看二叉树部分,还扫了几眼B树,B+树之类的。
又临时抱佛脚的在网上找了半天的面经,有今年的,也有往年的。
二面:忐忑过去二面。
二面到楼上,面试官先让自我介绍,然后问是一面还是二面(当天好像也有一面的人)。
我如实回答是二面。
然后,因为是侧面坐的关系(一面是面对面),我看见他在电脑上调出我的资料,于是就进入了二面的正题。
第一个是循环指针的问题,幸亏我之前复习过一点,阿弥陀佛!第二个问题是树的遍历问题,也过关了。
然后就让写代码,输出一颗树的所有邻居节点对。
貌似那位哥哥对我的数据结构设计还比较满意,看了下程序,问了几个问题,肯定了我的答案之后,又问有没有更好的,建议让用递归的过程。
我想了一会,没想出来,于是说,递归因为会影响性能,所以平常能不用就不用,我一时可能想不出来。
然后就扯了会编程风格的问题,这题算勉强通过了吧。
然后,那位GG说,下面再来一个难点的吧。
题目大概意思是,有一个容器,容量为S,还有N个物品,体积是个随机值,为Wn=ran(i)。
问怎样用最快的方式把容器正好装满。
我当时用了贪心算法和0-1背包问题的大致思想解决的,然后那位哥哥就让我求其复杂度。
后来那位哥哥说,用B 树的方式速度更快,就给我分析原因。
我如实回答,基本没有用过B树,只是对其有个大概的印象。
本来以为还有第三题,或者过不了关,谁知道下面那位GG忽然就问我手头有
offer了没,以及对百度的印象啥的,然后就让我回三楼等三面了。
我当时那个激动啊,差点没反应过来。
三面:
三面比较轻松,基本没有技术问题。
看样子应该是个manager之类的,问了些学校的情况,实习的情况,还有一些个人职业规划的问题,对个人履历又挑了些感兴趣的部分进行询问,还有一些模拟的情景问题,但不是不着边际的,一点也不刻意,估计是以后可能发生的事,比如关于加班的问题等等。
然后问我有什么问题问他没,我看时间不早了,早过了下班时间,也没好意思多问,就问了几个我最关心的问题。
也挺佩服这个manager的(我猜他是manager),感觉像,一天下来,估计得面不少的人,跟我讲话的时候,一直保持亲切的笑容,一点疲惫的状态也没有。
我最后咨询他的问题,他也很耐心细致的回答了,除了不告诉我我究竟能不能过三面(吐舌~~~)
总体上,三面聊得还是比较愉快的。
我现在只担心,当时我的话太多了,会“言多必失”,说了不该说的了。
也可能这就是那个manager的高明之处吧,让你有话可说。
就是不知道自己有没有不小心踩到“雷区”。
总结:总得说来,百度的工作效率还是特别高的,除了三面过后,之前一直特别快(当然,三面慢,也不排除被秒杀的可能)。
面试的时候,前后三位面试官,人都很nice。
出题目的时候,会有适当的提醒与引导,写代码之前,都会让你先复述一下你的想法,想法通过了,他们觉得有可行性了,再让你下笔。
只考察他们想考察的部分,不会因为非考察重点部分,就给你一个叉叉。
这也许这也是他们没有二次笔试的原因吧。
面对面的交流,可以让他们更准确的筛选到他们想要的人。
我记得我那个百度的学长说过,他们想要的是聪明的人,不是死记硬背的人。
比如我第一天写那个链表逆序的时候,因为我前一天瞄过一眼,觉得那段代码写得挺好的,当时我就特别想把代码重现,结果记忆力跟不上,没重现了,然后就紧张,就更难静心写了。
其实当时,我已经有了大致的思想,那位面试GG也通过了我的想法了,我当时不用想着重现某本教材上的代码,只要自己按照自己的方式写就行了。
二面的时候我就吸取了这个教训,复习的时候,只看大体的思路,临场把想法想好,被面试官通过之后,自己重新设计数据结构,重新编写代码。
可能速度上稍微慢了点,但是起码能把想法很好的表达出来。
一、算法设计
1、设rand(s,t)返回[s,t]之间的随机小数,利用该函数在一个半径为R的圆内找随机n 个点,并给出时间复杂度分析。
思路:这个使用数学中的极坐标来解决,先调用[s1,t1]随机产生一个数r,归一化后乘以半径,得到R*(r-s1)/(t1-s1),然后在调用[s2,t2]随机产生一个数a,归一化后得到角度:360*(a-s2)/(t2-s2)
2、为分析用户行为,系统常需存储用户的一些query,但因query非常多,故系统不能全存,设系统每天只存m个query,现设计一个算法,对用户请求的query进行随机选择m个,请给一个方案,使得每个query被抽中的概率相等,并分析之,注意:不到最后一刻,并不知用户的总请求量。
思路:如果用户查询的数量小于m,那么直接就存起来。
如果用户查询的数量大于m,假设
为m+i,那么在1-----m+i之间随机产生一个数,如果选择的是前面m条查询进行存取,那么概率为m/(m+i),如果选择的是后面i条记录中的查询,那么用这个记录来替换前面m 条查询记录的概率为m/(m+i)*(1-1/m)=(m-1)/(m+i),当查询记录量很大的时候,m/(m+i)== (m-1)/(m+i),所以每个query被抽中的概率是相等的。
3、C++ STL中vector的相关问题:(1)、调用push_back时,其内部的内存分配是如何进行的?(2)、调用clear时,内部是如何具体实现的?若想将其内存释放,该如何操作?vector的工作原理是系统预先分配一块CAPACITY大小的空间,当插入的数据超过这个空间的时候,这块空间会让某种方式扩展,但是你删除数据的时候,它却不会缩小。
vector为了防止大量分配连续内存的开销,保持一块默认的尺寸的内存,clear只是清数据了,未清内存,因为vector的capacity容量未变化,系统维护一个的默认值。
有什么方法可以释放掉vector中占用的全部内存呢?
标准的解决方法如下
template < class T >
void ClearVector( vector< T >& vt ) { vector< T > vtTemp; veTemp.swap( vt ); } 事实上,vector根本就不管内存,它只是负责向内存管理框架acquire/release内存,内存管理框架如果发现内存不够了,就malloc,但是当vector释放资源的时候(比如destruct), stl根本就不调用free以减少内存,因为内存分配在stl的底层:stl假定如果你需要更多的资源就代表你以后也可能需要这么多资源(你的list, hashmap也是用这些内存),所以就没必要不停地malloc/free。
如果是这个逻辑的话这可能是个trade-off 一般的STL内存管理器allocator都是用内存池来管理内存的,所以某个容器申请内存或释放内存都只是影响到内存池的剩余内存量,而不是真的把内存归还给系统。
这样做一是为了避免内存碎片,二是提高了内存申请和释放的效率——不用每次都在系统内存里寻找一番。
二、系统设计
正常用户端每分钟最多发一个请求至服务端,服务端需做一个异常客户端行为的过滤系统,设服务器在某一刻收到客户端A的一个请求,则1分钟内的客户端任何其它请求都需要被过滤,现知每一客户端都有一个IPv6地址可作为其ID,客户端个数太多,以至于无法全部放到单台服务器的内存hash表中,现需简单设计一个系统,使用支持高效的过滤,可使用多台机器,但要求使用的机器越少越好,请将关键的设计和思想用图表和代码表现出来。
三、求一个全排列函数:如p([1,2,3])输出: [123]、[132]、[213]、[231]、[321]、[312] 求一个组合函数。
方法1:依次从字符串中取出一个字符作为最终排列的第一个字符,对剩余字符组成的字符串生成全排列,最终结果为取出的字符和剩余子串全排列的组合。
优点:该方法易于理解,但无法移除重复的排列,如:s="ABA",会生成两个“AAB”。
方法2:利用交换的思想,具体见实例,但该方法不如方法1容易理解。
我们以三个字符abc为例来分析一下求字符串排列的过程。
首先我们固定第一个字符a,求后面两个字符bc的排列。
当两个字符bc的排列求好之后,我们把第一个字符a和后面的b交换,得到bac,接着我们固定第一个字符b,求后面两个字符ac的排列。
现在是把c放到第一位置的时候了。
记住前面我们已经把原先的第一个字符a和后面的b做了交换,为了保证这次c仍然是和原先处在第一位置的a
交换,我们在拿c和第一个字符交换之前,先要把b和a交换回来。
在交换b和a之后,再拿c和处在第一位置的a进行交换,得到cba。
我们再次固定第一个字符c,求后面两个字符b、a的排列。
既然我们已经知道怎么求三个字符的排列,那么固定第一个字符之后求后面两个字符的排列,就是典型的递归思路了。
基于前面的分析,我们可以得到如下的参考代码:如p([1,2,3])输出: [1]、[2]、[3]、[1,2]、[2,3]、[1,3]、[1,2,3] 这两问可以用伪代码。
北京产品设计笔试
纯文科背景,很简单的互联网产品经验,报百度纯粹是志趣所在。
笔试题与大家分享,如果是真心喜欢互联网行业的同学肯定觉得题目很简单。
1. 选一个你熟悉的百度产品,针对用户体验提出改进意见。
2. 设计一个在线音乐播放器的界面并说明设计思路。
3. 设计几个指标衡量百度图片所搜的用户体验。
4. 有一个手机通讯软件的添加好友界面,评述优点和确定,平提出建议。
5. 冰箱通常带有照明灯,请说明这一设计的必要性和适用场景。
以及微波炉是否需要这一功能?为什么?
2013年百度商业业务分析笔试题
一、推理题
1、根据已有信息判断正误
All people love running
Some people love cook(类似,记不清了)
Some people look like their masters
判断下面几句话正误
比如 all people loving run love cook
People love run look like their masters 等
2、有2只红袜子、20只黄袜子,31只蓝袜子,问抽几只袜子,能确保抽到两只颜色一样的?
3、有50个红球,50个蓝球,两个罐子,随机抽取一个罐子,随机抽取一个球放入罐子,问如何能让抽到红球的概率最大?(所有球的进入罐子)在这样的设计下,球数应该增多还是减少?
4、象棋中,如果最后只剩下了将和帅,有多少种状态是没有结果的?
5、推理题
8个将军射猎,其中一个人射中了鹿,但是国王让大家猜是谁射中的,8个人每人一句话,国王说只有三个人说的是对的,问谁射中了鹿?如果五个人说的是对的,那么是谁射中的?
6、切金子问题
15cm长的金子,每天给工人1cm,三刀,如何切?若是16cm可以么?
7、一个女生想找三高男,高个子、高收入、高学历,A、B、C、D只有一个满足要求,给了几个条件:
(1) A和B收入一样
(2) C和D身高情况相反
(3)三个高个子,两个高收入,一个高学历(记不太清了,大概类似条件)
问谁是三高男?
二、选答题
1、给出一个SNS网站推荐好友功能的策略设计。
2、移动互联网与PC互联网的异同,在商业流量变现的角度看两者的优劣势,那么搜索推广如何?
3、一个研究者对于广告页面绿色对点击率影响的统计,第一页和第二页都显示绿色会增加点击率,但综合统计显示没有明显关系,请问是为什么?采用什么统计方法进行分析?
4、公交IC卡的一个问题,它不只是一个金融工具,也可以提供很多用户数据。
从公交站、广告商等角度看广告的投放?(没仔细看。
)
【面经】
百度系统工程师(基础网络)北京
有点小惊讶,三次面试竟然全部都是电话面试。
而且三次面试都是技术面试。
但是个人觉得百度的网络岗位技术面试跟其他的公司很不一样。
1.百度重视基础知识,一些类似于传统的三次握手肯定是必问
2.百度重视应用,经常是给你一个拓扑,围绕着拓扑询问。
从某个知识点出发,但是又不拘泥于这个知识点,遗憾的是这一部分掌握的不是很好
3.百度比较人性化,问你一些问题的时候会事先征求你的意见,例如问路由协议的话他会提前问你,你觉得那一块掌握的比较好。
我觉得这一块我回答的挺不错的。
4.百度重视与面试者之间的互动。
同百度的老师们沟通交流时很愉快的一件事情,因为不像其他公司搞的那么严谨,你在回答问题的时候有很多机会可以跟老师们沟通交流。
有些方向你想歪了,面试官会温馨的提醒你。
总之有点类似于学生跟老师沟通交流某个问题时候的感觉啊。
百度上海,开发测试,三面归来
一面:
预定时间是22号下午四点。
我回去东一把数据结构,西一把算法,都不知道复习什么好了。
因为知道百度刷人刷得挺狠的,之前同学面试笔试北京百度的时候,不少都尘沙折戟了。
第二天,心情沉重的过去了,结果三点多就轮到我了。
面我的是个很阳光清爽的GG。
开始
让我自我介绍,说说学校的情况,以及简历上的实验室项目和实习项目。
然后他询问了一些感兴趣的部分,以及一些项目的细节,这些不在话下。
总体说来,一面问的东西蛮多的,也蛮全面的,好像一个小时二十多分钟,时间挺长的。
包括一些常用的linux命令、网络编程(估计因为项目涉及,所以就问了)、指针、数组指针、C++内存分配、函数压栈、数据库等等。
大部分是我擅长的东西,自我感觉前面答得还不错,但是我回去之后核查了几个问题,发现有个内联函数的问题答得不太精确,难怪那位GG后来又问我宏定义的问题,好在宏定义上面没有弄错,估计那位GG以为我记得稍微模糊了点,所以放了我一马。
后面写了几个代码,如果平时在学校认真学,应该都没问题,没有传说中的那么恐怖,当然,也不排除我运气问题。
第一个是输出1-100中所有的素数;第二个是链表反转第三个是Y链表可能因为第二个代码写得不太好,指针指来指去,把自己绕晕了,然后就有点紧张,再加上当时屋子里有好几对面试的,周围一直嗡嗡的响,后来那位GG可能看出来了我的状态了,就提示了几下,终于搞定。
然后,又补问了第三个问题。
以为自己没戏了,挂在链表上了,回来路上就开始各种伤心,觉得链表逆序,那么经典基础的东西怎么可以不会呢,特别的自责,连地铁都坐过好多站。
没想到,晚上收到二面通知:22号三点。
兴奋又感激,看来那位GG看我前面回答的不错的份上,给了我第二次机会。
于是我把指针重点复习了一下,顺带着看了看二叉树部分,还扫了几眼B树,B+树之类的。
又临时抱佛脚的在网上找了半天的面经,有今年的,也有往年的。
二面:忐忑过去二面。
二面到楼上,面试官先让自我介绍,然后问是一面还是二面(当天好像也有一面的人)。
我如实回答是二面。
然后,因为是侧面坐的关系(一面是面对面),我看见他在电脑上调出我的资料,于是就进入了二面的正题。
第一个是循环指针的问题,幸亏我之前复习过一点,阿弥陀佛!第二个问题是树的遍历问题,也过关了。
然后就让写代码,输出一颗树的所有邻居节点对。
貌似那位哥哥对我的数据结构设计还比较满意,看了下程序,问了几个问题,肯定了我的答案之后,又问有没有更好的,建议让用递归的过程。
我想了一会,没想出来,于是说,递归因为会影响性能,所以平常能不用就不用,我一时可能想不出来。
然后就扯了会编程风格的问题,这题算勉强通过了吧。
然后,那位GG说,下面再来一个难点的吧。
题目大概意思是,有一个容器,容量为S,还有N个物品,体积是个随机值,为Wn=ran(i)。
问怎样用最快的方式把容器正好装满。
我当时用了贪心算法和0-1背包问题的大致思想解决的,然后那位哥哥就让我求其复杂度。
后来那位哥哥说,用B 树的方式速度更快,就给我分析原因。
我如实回答,基本没有用过B树,只是对其有个大概的印象。
本来以为还有第三题,或者过不了关,谁知道下面那位GG忽然就问我手头有offer了没,以及对百度的印象啥的,然后就让我回三楼等三面了。
我当时那个激动啊,差点没反应过来。
三面:
三面比较轻松,基本没有技术问题。
看样子应该是个manager之类的,问了些学校的情况,实习的情况,还有一些个人职业规划的问题,对个人履历又挑了些感兴趣的部分进行询问,还有一些模拟的情景问题,但不是不着边际的,一点也不刻意,估计是以后可能发生的事,比如关于加班的问题等等。
然后问我有什么问题问他没,我看时间不早了,早过了下班时间,也没好意思多问,就问了几个我最关心的问题。
也挺佩服这个manager的(我猜他是manager),感觉像,一天下来,估计得面不少的人,跟我讲话的时候,一直保持亲切的笑容,一点疲惫的状态也没有。
我最后咨询他的问题,他也很耐心细致的回答了,除了不告诉。