微软面试感想

失败的一次面试,没有到终面。写下下面的失败经历,当做鞭策吧

 

11月1号参加微软面试,面试地点是北京海淀微软大厦

面试完忘了记录一下面试的经历,有必要写一下,补上。中间有些题目记不太清楚了,只写记得比较清楚的题目。

 

其实微软的面试问题并不太难。问题也基本上是让写程序,没有互联网公司那些乱七八糟的问题,考察基本工是不是扎实,是不是能灵活的处理一些问题,基本的程序都写不好,一切都没用。

 

一面:

开场面试官让简单的自我介绍了一下;

接着问了一些项目的问题;

后面面试官拿出纸笔,“那我们来写一个程序吧”(进入正题),面试官给人的感觉还是很轻松的

题目比较简单,leetcode中的一个题目:

一个二叉树,每个节点有一个next指针,要求每个节点的next指针指向层次遍历的下一个节点(每一层的最后一个节点的next指针指向null)

这个题目,之前在leetcode中做过,

最简单的方法就是用层次遍历的方法,给出了这种方法的答题思想,面试官看了之后说没有问题,开始写代码。

十分钟左右写完代码,面试官review一下,说没有问题。不过中间用到了队列是空间复杂度是o(N),让不用队列实现一下,

之前刷leetcode的时候这个题目确实还真没有队列,但是就是想不起之前是怎么做的(个人反应速度不是优势,比较放松的环境下解决问题还是很有效率的,

但是当给你提问题的人就在你对面等着你解决的时候,想着不好让人等久了、赶紧解决,搞得自己挺紧张的,反而不容及解决问题有时候还真脑子电路。好好反省一下)。

最后面试官给提示,如果当前这一层的next指正全部添加正确,那么下一层的next指正怎么添加。

考虑了会终于想起,可以用上一层添加好的next指针辅助添加这一层的next指针(之前明明是这么做的,也不知道怎么当时就脑子短路了,真是够笨的)

 

一面结束让到等候厅等待。

 

二面:

面试官相对还是比较年轻的大约30岁。

首先也是问了一下项目和实习的事情,问“某某某知道吗,他在你实习公司的同一个部门工作”,部门人多流动也大表示并不知道(闲聊了大约十分钟)

第一个题目:让写一个函数,给出三条边的长度,判断这三条边是不是能组成三角形;并且尽量给出全面的测试数据,期望的输出和程序的输出。

题目并不难,主要考察的是考虑是不是全面,对于非法的数据是不是能够合理的处理。

比如三条边不是非零的正整数,一定是不能构成三角形的。

边界条件,当两条边的长度之和正好等于第三边的长度的时候,这个时候也是不能组成三角形的。

考虑溢出的情况,如果用两边之和大于第三边的判断方法,两边长度相加要考虑整数溢出的情况(只好使用两边之差小于第三边)。

第二个题目:给出一个函数rand100()随机产生1-100的随机数字,现在让用rand100构造一个函数rand10000产生1-10000的随机数字(当然不能用其他库函数)。

听着也挺简单的(100个rand100()的值相加先不考虑是不是产生1-10000的数组,中间产生的数字明显就不是随机的)

最后给出一种方法rand100*100 产生100、200、200------10000的100个数组,rand100()*100-100产生的就是0、100、200------9900的一百的数字,在这一百数组的基础想加上rand100()产生的就是1-10000的10000的随机数字了。

后面有给出里一个相似的题目用rand100()构造一个rand1000的函数。

第三个题目:两个主机之前传递两个数字,但是由于传输信道的影响不能传递空格只能传递0-9的数字。也就是怎么编码两个数字为一个数字并且能够正确的解码到原来的两个数字

首先假设传输的两个数字的位数长度之和不超过100,这样只要拿出前两位表示第一个数组的长度,就能够用这个长度区分两个数字。

后面面试官说不能添加这个长度之和不超过100的限制,这样就不能确定用几位表示第一个数字的长度了。太长了让费空间,太短了表示不了长度。

又给出一个比较笨的方法:编码的数字分为四部分abcd,其中cd表示编码的两个数字,数字b表示数字c的位数,数字a表示数字b的长度,并且数字a用两位数字表示,

那么数字b的最大长度就是100,数字c的最大长度就是10^100在实际应用中足够使用了。

听到这种解决方法,看面试官的表情也挺无奈的,问题确实能解决,但是我知道他肯定不是想要这种解决方法,

后来想了想有给出一种方法:将编码数组分成部分abcd,c、d还是实际编码的数字,数字a表示数组c的长度,数字b表示数字a的结束,

数组b用01表示,数组a中出现0的地方用00表示,也就是用0作为转移字符,这样a中的01就用001表示。

面试官心情不错,最后的时候还提供了一种他解决方法,编码数组用abc表示,b、c表示要编码的两个数字,数字a用9进制表示,这用就空余一个数字用作数字a的结束标志。

 

三面:

题目一:证明一个数字的各个数位之和能被9整出,那么这个数字一定能被9整除。

只要将数组abcde拆分来了,拆成几个数字相加的形式,比如a*10^5就表示其中的一项;在从每个加法项中提取出一项,比如a*10^5,提取除一个a这样就变成a*9999+a,

a*9999肯定时能被9整除,剩下的就是a+b+c+d+e能不能被9整除了。

 

问题二:给出两个“YYYY/MM/dd"形式的字符串表示的日期,求出两个日期之前的间隔天数

题目很简单,但是写程序比较麻烦(判断字符串是不是合法,解析字符串提取y、m、d,同事还要判断日期是不是合法,以及是不是闰年……)

听完这个题目就有点抵触(前面面了两个多小时还是真有点累),没办法只能硬着头皮写吧,程序写的特别潦草(应该反省)

 

问题三:一个有序的数组,做了循环移位,要求找出这个数组中的最小值。有一个leetcode上面的题。

题目也是很简单,但是关键是细心啊!!!!在纸上写程序也没有机会让你调试。

匆匆写了个二分查找,稍微检查了一下。

面试官看了之后,说边界值是不是有问题,我看以一下,找了一个测试数据试了一下没有问题,直接就说没有问题(后悔,但是面了接近三个小时,实在是有点抵触了)。

面试官看完之后自己找了个数据算了一下没问题,也就打算过了,后面突然发现了一个测试数据确实是存在为题(哎。。。)。

本来都想好了,之后碰到二分查找的问题,当划分到数据小于三个的时候直接暴力判断返回(当时也不知道怎么想的,可能觉得二分也写过不少次了没问题。。。)

 

三面结束,,没有走到终面,挺遗憾的

总结一下主要的原因,

首先自己能力还是不够

其次面试心态一定要摆正

 

posted @ 2015-11-13 16:23  li-xingtao  阅读(367)  评论(0编辑  收藏  举报