分享面试经验,通过例题分析国内面试的风格及准备方法
1) C/C++部分:
2)实现 memcpy 函数
STL 中 vector 的实现原理
2)概率题部分:
给 N 张牌和一个随机函数,设计一个算法对这堆牌进行洗牌
3)智力题部分
25 匹马,5 个赛道,最少赛多少次找出前三
4)操作系统部分
进程和线程的区别和联系
5)大数据部分
100 亿个整数,如何找到中位数
6)算法题部分
手写快排
手写堆
刷LintCode
本节通过真实的笔试、面试题讲解 C++相关的基础内容,包括各种关 键字的作用,字节对齐,智能指针,单例模式等
1) 叙述智能指针的原理
衍生出 STL 中 auto_ptr 以及 shared_ptr 的使用
如果出现循环引用如何处理?
2) C++单例模式写法
衍生问题:如何定义一个只能在堆上定义对象的类?栈上呢?
3) struct 的字节对齐问题
4) C 与 C++易混淆概念分析
引用和指针有什么区别? const 和 define 有什么区别? new 和 malloc 有什么区别? define 和 inline 有什么区别?
5) static 关键字用法总结
衍生问题:成员函数能否声明为 static 和 const 的呢? static 函数能否调用非 static 函数
6) const 关键字用法
7) C++四种强制类型转换
本节详细讲解 C/C++面试中非常高频的虚函数、虚继承以及 C++对象 内存模型,从此遇到这类问题不再“虚”!
1) C++虚函数详解
什么是虚函数,有什么作用? 虚函数实现原理:包括虚函数表、虚函数指针等 衍生问题:为什么 C++里访问虚函数比访问普通函数慢? 为什么需要虚析构函数?内联函数、构造函数、静态成员函数可以是虚函数吗?构造函数中可以调用虚函数吗?
2) C++虚继承详解
为什么需要虚继承? 虚继承实现原理解析
3) C++对象内存模型详解
融合虚函数、虚继承,讲解 C++对象模型
本节详细讲解国内面试中高频的智力题, 并总结常见的解决这类问题的思路与技巧
10+个常见智力面试题
操作系统相关的面试问题
1、请设计一个抽象类,用来支持有序数组归并任务
2、请设计一个LRU Cache
3、设计一个在线聊天系统
4、设计一个基于内存的简单文件系统
5、设计一个支持多终端的日志打印系统(如向文件打印、向网络打印、向屏幕打印)
6、设计一个棋盘游戏
7、请设计一个数据结构,它能够支持插入、删除、最大值、最小值、随机返回一个数的操作
8、设计一个函数,使得它在n毫秒内最多访问M次
1、Map-Reduce原理
2、BloomFilter原理
3、Trie树原理
4、两个大文件,每个文件里都存有上亿个url,怎么找到重复的url
5、给百度一天的querylog,如何找到一天中出现频率最多的k个query
腾讯首先是笔试嘛,线上笔试。涉及很广,应该是研发,运维,客户端,前端都是做同一套试题的。包括了操作系统,网络,c++,java,ios,前端都有。反正做得一般。过了。
旁边的小伙伴都已经收到了现场面试的通知,我也还没收到,那时比较紧张。反正后面收到了,一看傻眼了。。我竟然被安排电话面试了。。一问在里面工作的学长,说有可能我的那个部门的面试官没来重庆。
没办法。只能在学校接了电话,一面大概是30分钟吧。问题如下:
1.让我介绍我一个亮点项目
我就说了寒假在搜狐实习的项目,项目用的redis实现的消息队列。然后面试官就问我怎么实现的消息队列。。
怎么减少并发压力,怎么检测的。数据从没用redis之前的数据到用了之后的数据变化。
2.看到我的简历有Linux运维方面的经验:问一般linux服务器如何定位错误或者是服务器并发量检测什么的。从内存,线程,网络方面问 ps:他很想知道怎么定位网络错误的。没怎么答出来
我就开始说使用top lsof netstat等等命令怎么检测的,还有就是zabbix监控工具。
3.说我用过Memcached吧。。直接问我知道有什么缺点
我就和和redis比较一下。数据类型、分布式两大方面说的
开始问基础。
4.排序二叉树。描述插入的操作。。然后说了一下平衡树
5.大端区和小端区的区别。 网络序是用的大端区和小端区?
不太清楚网络序是什么。然后问 知道什么是网络序和主机序。
6.用c还是c++比较多。说c。。扯到文件读写
7.硬中断和软中断的区别。。网卡收到数据包是硬中断还是软中断
8.网卡收到数据包到应用层的过程。。
一面完了,觉得自己后面的问题都是跪着答的。就想着拼死问一下哪个部门,一问是TEG的架构平台。。我日哦。然后面试官还对我说,他们部门一般亿级数据的优化,一般会涉及到网络和主机的方面什么的。
大约过了2个小时,刷了一下状态,过了。。。
我以为2面也是电话面吧,谁知道过了一天。收到了要去现场面试的通知。。我又晕了一次。同学有的都面完hr面了。。我才去面二面。一问还知道了面试官是后面才过来的重庆。我连签到都不用,直接去面试官住的房间敲门。。也是醉醉哒。
9点要面。酒店离学校坐车还有大概50多分钟。我只能很早就起来了。在地铁上看我的笔记。刻骨铭心。
去到酒店。面试官很早就在等我了。人也很nice。让我休息了一下。开始问我的问题。
1.自我介绍:亮点项目。说了nginx。然后就开始问
2.nginx如何处理一个请求。
从主进程建立监听请求。如何交给worker进程到事件驱动,到进程间通信,如何返回一直问。问到不懂为止。
3.db方面,如果上线了的db查询变慢了。怎么定位,解决方法
定位的话,说了mysql的监控,包括日志什么的。解决的方法说了分布式,加cache。然后问了一台mysql挂了,如何做,立刻切换到备份机,备份机的机制使用复制,复制是怎么完成的。
4.设计题。40亿qq号,20w/s QPS ,设置怎么存储,怎么解决请求。单机是32G内存,1T硬盘,抗5w/s极限请求。
特别想知道是怎么设置存储,减低存储量和怎么查找快(半个小时,在纸上画,还算这样设置占了多少内存,多少硬盘,数据结构是怎样的。。)
从设置索引到分析qq号的特性来完成存储什么。面试官也会提示,一问一答让这个系统怎么设置的更好。反正没有最好答案。
5.手写了个字符串逆序
6.自由发问
面了大概50多分钟
最后面试官竟然让我直接去找HR面试。我只能面不改色的答应了。因为我知道那天是最后一天了。肯定要面完吧。是不是说明我二面已经过了。不多想。直接去找HR了。
hr面(30分钟):
1.自我介绍
2.对腾讯的了解,说说文化
3.一支笔10种用法
4.是否单身
5.什么时候可以实习
6.大学期间做过最有成就感的事
最后拿到offer了,希望大家也能拿到好offer.
前段时间参加阿里巴巴校招,非常荣幸,很快就拿到了offer,经历了三轮技术面试和一轮hr面,面试官们都非常nice,为了帮助更多人想进阿里巴巴的同学完成梦想,特此整理了一下面试的问题,给大家一些建议,希望大家也能成为阿里巴巴的一员。
主要注重基础,问得很深很广,压力面试。
1.hashmap、concurrenthashmap底层实现和区别
2.spring框架的原理
3.如何写一个orm框架
4.hibernate一级缓存和二级缓存,hibernate其他缓存
5.hibernate事务传播行为种类
6.springmvc原理
7.restful的好处
8.restful有几种请求,表单如何提交put请求
9.web中安全性问题的考虑,如何防止
10.web系统整体架构
11.hibernate如何实现声明式事务
12.java并发包
13.volatile
14.平常都看哪些书
15.spring底层数据结构
16.如何进行反射,如何提高反射的性能
17.如何实现java的代理,为什么需要实现接口
18.TCP协议三次握手
19.springmvc用过哪些注解
20.springAOP可以使用哪些代理,有什么区别
21.为什么要分三层
这面没有准备好,广度很深度压力很大,建议大家多看看三大框架源码、原理。
注重于项目
1.什么是restful web service?
2.并发集合包?
3.项目中使用了哪些数据结构?
4.TCP中断连接四次挥手?
5.MD5加盐
6.https
7.支付宝接口开发
8.知道哪些锁?
9.依旧JDK源码
10.项目遇到什么问题,怎么解决?
也许是觉得一面已经问了很多了,这面又答得比较不错,20分钟就结束了,30分钟出了结果。
聊人生
可能是觉得技术差不多,这面基本没怎么问技术,主要是职业发展、IBM的实习内容之类,我想大家可能也都有自己的想法,18分钟。
hr面聊成长经历
非常幸运,一小时之后hr姐姐就打电话来确定offer了,hr姐姐非常nice,非常和蔼开朗的姐姐,聊了一下对B2B的认识和自己的技术成长历程。
有道是我非常想进的一个部门,为啥?离学校近阿。。。
但是有道的hr我真是无法吐槽,面试过程慢的一塌糊涂,这个点应该算散招,又不是全国招聘人很多,但是从我投简历到最终知道结果足足一个多月
首先去笔试。。。坐8个人的大圆桌硬是坐了16人好么。。。我都没地方放我的卷子好么。。。我的选择题答案人家扫一眼全看去了好么。。。笔试只有选择题和算法题,但是签了保密协议所以具体题目不能说,但选择题主要是考数学概率方面的(给跪了好么。。。),算法题都还ok
然后一个多礼拜过去了没消息以为跪了,后来跟我说因为端午大家都休息了(看来大家都很悠闲阿),然后通知我下礼拜二去面试,当天我抬头挺胸的就去了,然后前台hr说我电脑里没有你的信息阿,我就跪了。。。(我真不是来霸面的阿。。。),等了一个小时,没人鸟我(hr你不应该来安抚我一下么),打算撤了,后来想到有道里面有学长可以帮忙阿,于是让学长帮忙,最后发现是hr实习生忘了通知面试官,也忘了做面试安排(真是跪了。。。) 然后一面面试官哥哥先是扯了半天,然后写了三个代码题(stringToFloat, isValidIp, Singleton),又问了很多小问题(比如你对c++11有了解么,对boost有了解么),发现时间有空,就给我介绍有道,问我对哪方面感兴趣,真是好人阿~ 二面是manager面,给了一个比较实际的项目,说类似有道字典的修正功能该怎么实现,窝balabala。。。中间一个字符串的编辑距离的动态规划题我逗比很很久(leetcode真是刷完就忘。。。)
在水木看到的招聘信息,于是就投了下试试。然后过了几天接到电话让我去面试。
正式面试,面了项目,数据库表的设计,sql查询(忘的差不多了。。),还问了两三道算法题:
1)找出2.5亿个数中不重复出现的数(我答了以大化小的方法,即类似桶排序把不同range的数写在文件里,然后处理文件,这样内存即可接受,当然我也知道bitmap可以做,但是当时我好像没有彻底理解这玩意。。。出来后理解了一下,但是面试时不该说的,显得我知道这个又不去了解透彻,一大败笔。。。)
2 )如何找出1-100中没出现的一个数,保证其他99个数都出现(和一定或者用哈希表就ok)
3)找出其中没出现的两个数呢?(哈希表,后来貌似发现还可以找出这两个数的和与积,解个方程就好了)
最后问了我对百度知道这个产品的看法,给跪了,现在招码农都要有pm能力吗?我觉得我还是往全栈工程师发展好了。。。。
百度的笔试又是在九龙湖,来回又折腾了半条命,11点多睡觉了,睡在床上睡不着,12点多了,忍不住去看看手机,一看有个未接电话,3分钟前打的,直接回拨过去了。电话那边是个女的(以为是HR,后来才知道就是我的一面官),说是百度招聘的,约我次日9:00或11:00面试,我当然选了11:00的。
次日11:00点准时到达中央饭店,敲门时,一妹子开门,我一惊,第一次遇到一个女面官。女面官人很好,很热情的招呼我做下,先做了个自我介绍。然后问了下计算机网络,在浏览器里敲入一个网址,会发生哪些过程、经历哪些设备啊?这个在美团问过了啊,我劈里啪啦的讲了。她中途打断了我,你说慢点,就深入问了下细节,说传输的时候为什么要从运输层到数据链路层,路由的详细过程是怎样的?路由的详细过程看过,但真的不怎么记得,就和她说,这个我了解大致的过程,详细的细节记得不大清楚了。然后问我多进程和多线程用过没,我说用过,那死锁听说过没?我说听说过啊。她说那你写个多进程、多线程死锁的程序。我靠。。。这怎么写啊,心想,平时只懂一些概念啊!憋了一会,不知道怎么搞,就告诉她:“这个多进程、多线程的API记的不大清楚”。她说:“那你用伪代码”。这下,好了,我就用伪代码,表达了下意思,然后给她讲了下,她笑了下,就算过了。总之面试中不管遇到什么样的问题,即使自己不太会的,也要换个角度,努力下,不要轻易放弃啦!
接下来,就问项目了,把项目的架构讲了下,她问:“你这个项目的优点和缺点是什么啊”,我说:“优点是,数据库我优化了下,主要是分区优化的”。她说:“怎么分区的啊”。我说:“按时间分区的,一个月为单位”;她笑了下说:“你这是南京市的数据,那若是全国呢,你怎么办啊,你是不是要按天分区啊?”。然后,她又问:“那么,在高并发的时候,你怎么提高效率啊?”。我想了下:“说,数据库前面加一个缓存,采用数据分片,将大文件分成很多小块,并行的写入多个服务器上。读的时候也可以并行的读,然后整理成一个文件,这样把串行读写变成并行读写,提高效率”。她听了笑了下,表示认同,然后又深入了下:“若现在是10台服务器,现在要变成20台服务器,你设计一种方案,使服务不中断,不影响客户”。我说:“这个是数据迁移,现在的IT企业数据迁移一般放在凌晨,尽量减小对客户的影响,我的方案是,从某一时间点开始数据迁移,读数据从原来的10台服务器读,写数据写在新的20台服务器上,同时原10台服务器的数据向新的20台服务器迁移,等到数据全部迁移完毕,所有的读写都在新的20台服务器上”。她说:“那我,写入新的20台服务器上,突然又要读呢,怎么办?”。我说:“哦哦,这个忘了考虑,从数据迁移的时刻开始,对写入新的20台服务器的数据进行标记,每次访问数据时,若访问的是迁移时刻后的数据,就读新的20台服务器,否则读老的10台服务器”。她笑了,说:“方案可行,实施起来可能还有些问题”,然后笑了笑,又接着深入问了:“那你怎么保证数据的可靠性呢?”。这个好回答啊,正好看了类似的东西,说:“我看了些集群分布式文件系统的知识,这个可以借鉴下,就是多副本技术,数据片在不同的服务器上至少存2个副本,2个副本之间相互同步,若一个crash了,系统会向上report,会重新创建一个副本,这样可以提高数据的可靠性”。她笑了笑点了点头。
然后看了看我的笔试题,问了下,你觉得笔试题难不,我说不是很难?笔试有个题目,我有几种方法,之前只写了一种,我又把其他的方法和她讲了下。然后,她说,笔试考了个memorycpy,你给我写个strcpy把。我劈里啪啦地很快就写好了,然后给她看了,并且和她解释了下,各种可能的异常情况,比如无字符串结束符’\0’,内存区域重叠,内存区域重叠不是很确定,然后和她说:“memorycpy要考虑内存重叠,这个不知道会不会有,重叠了,之前不就会异常吗”,她说:“你回去好好想想”。
然后MM说,“我的问题差不多了,你有问题问我不?”,我说:“有,我说像我报的软件研发,在baidu,具体大概做什么啊?”,MM很热情地几乎把她们的所有业务都讲了一遍:“从流量、广告、搜索、支付、团购基本都讲了一遍,然后又说,我是做支付的”。然后又问:“还有不?”,我说:“有,以前听说百度未来主搞人工智能、大数据和云计算,这次正好遇到了,好好请教下,哈哈”。MM笑了下:“你说的也是的,做人工智能、大数据和云计算也是做未来的搜索,百度的流量大,自然需要大数据的处理”。看着MM这么热情,然后我又问了个问题:“说我对云计算比较有兴趣,之前接触过一段时间,可以问问baidu云计算主要做的是IAAS,paas还是saas啊,团队的规模又多大啊?”。这个还把MM难住了,MM说:“我不是云计算相关部门的,接触的不多,这问题,不好回答你啊,不好意思”。我说:“没事,好的”。MM说:“这次面试,到此结束,你保持手机畅通回去等下通知吧”,我看了看时间,11:50了,肚子饿了,想必MM也饿了,然后说了句:“谢谢您,您还没吃饭把,您幸苦了!”,然后MM送我到门口,说了彼此说了声再见,这么神奇的一面就这样结束了。感觉很好,聊的很哈皮,这次面试真是我这么多面试里最美好的一次。
不出所料,晚上8点多,接到百度2面的电话,约好时间是次日上午9点,一大早7点就起了,去实验室整理了下就骑车去了中央饭店。貌似那天没什么二面,好多都是一面的。约好的9点,一直等到10点二面。这次是男面官。上来让我挑一个项目介绍了下,因为项目中涉及到网络的问题。面试管顺势问到,:“网络序是什么大端模式还是小端模式啊,x86的本机序呢?知道什么叫大端模式和小端模式吗?”。我说:“知道,就把大小端模式的区别说了下”。他说:“那你写个小端模式转大端模式函数把”。这个以前还真没怎么想过啊,不太确定对不对,想了下就写了,因为要求输小端int,输出大端 int ,没深入地想,用了个最笨的方法,用% / 把int 数据的每个字节都取出来存入数组中交换顺序,写完给面试官讲了下,他也没说什么。后来想了下,不必这样用位运算&加移位运算就可以搞定了。和同学讨论了下,他提出了一种方法更简单,共用体union
Class Union
{
Int a;
Char b[4];
}
只需交换b中字节的顺序,int a 自动大小端转换了 这个方法好啊。
然后又问,命令执行的状态怎么看,我说看$?就可以了。命令执行失败$?为1,执行成功$?为0,然后说通过查看这个值,经常可以把shell脚本写成交互式的。
然后说你懂shell编程是吧,那现在给你一个日志文件,文件有3列,分别为iP,访问时间,内容。你用shell编程找出访问量最多的10个IP。想了下,这个用shell还真不会啊,就和面试官说了,我shell一般是配置文件,和自动安装rpm等,这个要到排序啊,用C++,我会啊,用shell真不会。
那出道编程题把,面试噼里啪啦在纸上画了棵二叉树,说找最低公共祖先。我一看这不是剑指offer上面的最后一题吗,我想了一下,把几种方法一一道来,果断搞定啊。
然后面试官看了下时间,说你有问题问我不,我说有啊,又把一面官的前两个问题问了一遍,哈哈,其实问什么问题不重要,重要的是通过问问题表现出我对百度的兴趣,和对未来工作的热情和关心。
百度3面大概等了3天,据说是要1,2面都结束,统一3面。3面约定的是上午11点,这次貌似是个boss,很有气场的样子,上来递过简历和笔试试卷。他看我的简历时,我说,需要自我介绍下不,他说,不需要。好吧,上来就说,你不是计算机系的,数据结构与算法 分析,系统学过没啊?我说,学过啊,不过是自学的,看了几遍了。本科和研究生也学过部分计算机相关的课程。还有研究生的一些项目也和软件编程相关的。然后,他问那你是怎么学的啊,我说通过看书、看博客、编程实践、和实验室的同学讨论、还有实验室的一些项目也正好用到一些,就这样学的啊。
然后就出了个题目让我求时间复杂度:
Int i=0;
Int s=0;
While(s
S+=i++;
这个乍看还还不好看出来,我在纸上画了下,想了下,说时间复杂度是根号N。确实是的,他也认同了。
然后让我写了个二分查找,二分查找容易出现死循环,这个当然要注意了啊,其实还有二分,三分,递归实现和循环实现,都练习过了,所以很快就一气呵成的写出来了。然后给面试官讲了下,二分查找有多种实现方式,这里给出了一种,并且说了应注意的问题。面试官也认同了。
然后让我做了个逻辑题,100个人,100盏灯,每个人走在灯前,若的灯序号是人号的倍数的,把灯开关按下,之前灯都是关的,问最后哪些灯是开着的。这个题目做过多遍的,只要是灯序号是平方项的,就是奇数次开关灯啊,灯肯定亮着的啊,问题转换为看灯号是否是平方项,若是则亮的,否则是关的。
然后问了几个和技术无关的问题,比如,效率和质量出现冲突,你怎么解决。他说,比如你老板交给你个任务,要在某个时间点之前搞出来,但如果保证高质量,就任务就完不成。我说,效率第一,兼顾质量,先保证有,再保证好。说如果在时间节点之前不能交货,就是事故,要负责任的。但如果,能在时间节点交货,即使质量上还有些小问题,但后续还可以完善的。如果什么都没有怎么和客户交代呢。面试官也点头认同。
又问,在职场交流中,你有什么技巧啊。我说了相互尊重,分享、交流沟通、幽默感。相互尊重是一切的基础和前提,然后逐个举例论证了下,每个人可能会有一些新的想法或接触一些新的知识,可以和同事分享,这样慢慢的,团队的整个实力就会提高。
然后又问了下,你经常在网上看技术文章不,我说看啊,他说在哪儿看啊,我说csdn 博客园,他说,最近看过没啊。我说看过了,他说,最近看过啥啊,我说看过电商架构,他说,哦哦,那你把电商架构画一下。我噼里啪啦就 大概的画了下,然后,他又问,最上层是负载均衡。那你给我讲下,什么叫负载均衡。我说负载均衡一般在4和7层上的。还没说完,他打断了我,说你给我讲什么叫负载均衡就行了。好吧,我说:“负载均衡有两种,一种是,讲海量的访问iP,导向不同的服务器;另一种是对于重载的单任务,将其分解为很多小任务,分配给不同的服务器,服务器处理完后,讲结构归并整理,得到总任务的结果。”
最后不小心扯到cdn,面试官又追问了,cdn的英文是啥啊?我靠,这个只知道用途啊,算是给自己挖了个坑啊,后来查了下,是content delivery network 一种智能网络。
面试的时候,自己不太清楚的东西最好不要说,不要挖个坑把自己埋了,还不知道。
注:本文转载自CNBLOGS,作者“无疆之马”。