微软百度实习面经

最近RP有点差,写一点面经攒攒人品~

About Me:

复旦计科大三狗一枚,成绩平平,因为大三上去新国大交流了所以寒假开始的比较早,投了几家公司准备混个实习经历。最后拿到了度娘和M$的offer,写一点面经攒攒人品,希望给大家一些参考啦~

百度

因为面试的时候在新加坡,所以本来的onsite变成了QQ语音+skype混搭的电面感觉有点诡异呢-.-言归正传,面试一共有三轮,第一轮主要是项目面,第二轮主要考察技术水平,如算法,语言,系统知识等。第三轮是经理面,经理问的问题就比较宏观了,从career path到intern经历都有聊到。感觉三轮的侧重点还是蛮不同的,所以光刷题可能不一定够用哦

第一轮:

开场是自我介绍,然后就问起了项目经历。我主要讲了两个相关的项目,其中一个是linux下web server相关的项目,可能因为这个项目正好和百度做的事情挺相关的,因此问得很细。从HTTP协议里GET和POST操作的区别到server架构的不同类型(多线程,select/epoll模型)都有聊到。如果对这方面的知识感兴趣的话推荐的必读书目自然是那几本经典著作:《UNIX环境高级编程》(APUE),《UNIX网络编程》(UNP),不过经典大部头一般都比较晦涩难懂,你懂的。。(看不懂的话这些书分分钟可以当做催眠神器ORZ)。我重点介绍的另一个项目是一个linux环境下简单的shell(类似于bash),讲了一下项目的架构之后,又讨论了一下管道操作的一些问题。问完项目经历后,就开始聊语言了,悲剧的是虽然我写了擅长C++,不过面试官问的一些关于C++ tricky的问题我基本都没答上来- -问的问题主要围绕在STL上,包括:vector容器可用的元素类型有什么限制,调用clear()的时候是否释放内存空间;map容器的内部实现使用了什么样的数据结构,操作的复杂度怎么样;影响hashtable效率的因素都有哪些。这方面推荐的参考书有《C++ Primer》和《STL源码剖析》。问完语言问题之后又问了一道算法题,这道题貌似还是悲剧了0 0(现在想起来一面好像跪的很惨为什么面完感觉还挺不错的。。。)题目是这样的,给你一个链表,每个节点除了有一个next pointer指针指向下一个元素之外还有一个random pointer指向这个链表里的任意一个元素,要求设计一个函数,以这个链表为输入,返回这个链表的一份拷贝。做链表题一直很苦手,所以被问到这题的时候感觉很头大,想了半天说了一个用到map的解法,面试官说可不可以再优化一下,然后就卡住了,一直到最后也没回答出来。后来去网上搜了一下发现是leetcode上的原题(copy list with random pointer),所以。。。人傻就要多刷题,姿势水平还有待提高啊。。。问完这题一面就结束了

第二轮

第二个面试官很直接,问的全是技术问题,整理如下:

1:给出用linux shell命令获取两个文件的交集,并集,差集的代码

2:给一段C++代码,找出里面的错误或不合适的工程实践,主要的错误有vector的元素没有提供默认构造函数,需要用delete[]的时候只用了delete,用strcpy复制字符串但没有提供越界检查,用==比较浮点数等。

3:算法题,给一个int数组和一个target元素,删除数组里所有和target相等的元素,返回删除后的数组,要求效率尽可能高。这道题还是挺简单的,设置一个指针指向数组末尾,从头遍历数组,若遇到和target相等的元素就把数组末尾元素赋值给当前位置,把末尾指针往前移一位,需要注意的是末尾元素也有可能等于target,所以这里也要check一下。

4:设计题,有一个很大的log文件,每一行是一个query,包含query id和query info。query可能重复,要求按query出现次数从高到低排序,生成一个文件,实现尽可能高效。这个问题我想的方法主要是多线程+流水线处理。

5:一道编译相关的问题,因为还没学过编译原理所以完全没答上来。。。

第三轮:

第三轮是经理面,经理面的气氛比较轻松,上来先聊了一下项目经历和intern经历,之前有在一个小的startup做过一段时间,没想到他居然知道这个公司,还认识他们的老板- -然后就详细的聊了一下在这家公司里干了什么活,不过我做的事情其实水的很,随便扯了几句。然后就聊起了career path之类的问题,将来规划怎么样,想不想出国,觉得什么样的公司算好公司等等。问完这些之后又问了一道设计题,设计一个在线同义词词典,要求返回结果的延迟尽可能低。这题一开始没什么思路,先讲了如何判断两个同义词是否相近,大致是通过百度的搜索记录提取词的特征,计算它们的欧几里得距离然后归一化之类的。然后为了提高效率可以离线预处理好词库,用缓存提高效率。然后又讨论了一些细节问题,经理看问不出什么就放过我了。

 

微软

每一轮基本都是先自我介绍,然后介绍自己的项目经验。每一个项目都有可能被问起,所以项目最好能正着背倒着背跳着背都能对答如流。面试官主要关注项目的架构,与现有类似项目的优劣比较,如果是网络项目的话还会问及并发性相关的问题,不过这个年级的大学生做的项目基本上是toy project,所以这方面如果有所不足也不用担心。具体的编码细节可以不用讲的太细,重点关注项目的难点即可。除了这些以外,每轮还有必不可少的coding环节,这个时候在白板上用正确的姿势写出bug-free的代码就很重要啦。面试官问的问题一般都是比较tricky的题目,所以一开始想不到正确的解法也没关系。可以先尝试把自己的思路分析给对方,或者在白板上画出图示。在讲的时候自己的思路也会清晰起来。面试官在这个过程中会提出一些问题,注意这些也可能是提示条件。在解答算法题时,面试官会要求你对自己的代码提供单元测试,找出特殊的test case。

 

一面

给一棵二叉排序树和其中一个节点,返回这个节点在中序遍历下的下一个节点。

函数原型:Node* findNext(Node* root, Node* target);

思路:

递归实现,判断root和target是否构成直接的parent-child的关系。

如果是的话按照是left child和right child分情况讨论。

1:若target是root的left child且target有right child,应该返回target的右子树中的最左端节点。若没有right child,返回root

2:若target是root的right child且target有right child,应该返回target的右子树中最左端节点。若没有right child,返回NULL

3:如果不是的话递归调用findNext(root->left,target)和findNext(root->right,target),需要注意的是这时候两个函数中至多只有一个会返回有效的指针,因为target只可能在左子树和右子树之一。

 

二面

给定一个range的vector,每个range应该包含左端点,右端点的信息,左右端点都可能开或闭,设计一个函数合并vector中相交的range,返回合并后的vector

思路:

设计range的结构如下

struct range{

         intleft;

         intright;

         intleftOpen;

         intrightOpen;

}

函数原型: vector<range> merge(const vector<range>& ranges);

leftOpen和rightOpen表示左右端点是开还是闭的。首先将ranges数组按照left排序。然后用贪心法合并相交的区间。需要注意的是判断两个range是否相交要处理左右端点重合的特殊情况,分成开或闭分别讨论。

还有一个需要注意的地方是range的构造参数可能会传入非法值。一个比较好的方法是使用factory method来进行初始化,把构造函数设成private。

 

三面

概念题:

单核环境下多线程的实现,常见的调度算法。

多核环境下多线程的实现,如何保证属于同一个进程的线程之间的数据互相同步。(分配到不同的CPU上可能会产生竞争条件)

两道算法题

第一道是水题:给定一个链表,返回reverse之后的链表

思路:略。。。leetcode上有原题啦

第二道题:实现C语言的malloc和free函数

假设你手头可用的资源只有内存,没有其他底层接口函数。可以假设memory是一个大的char数组。给出设计思路和代码。

思路:

这题涉及到底层的实现,感觉自己答得不是很好。主要的问题在于malloc的时候如何快速找到可用的内存空间,分配完内存后如何标记,释放时如何获取给定指针需要释放的内存空间的长度。

 

总结:

感觉大公司面试还是比较偏重基础知识的,如果大家有志于BAT或者FLAG这样的公司的话还是要好好学习语言/算法/操作系统/网络这些核心课程哦。最后祝大家2015可以做想做的事,实现心中的目标啦~新年快乐!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值