微软面试总结

电面

问答环节

上来先问了一些项目相关,简单介绍一下。还让我介绍了某个项目的整套流程(因为我司项目业务逻辑很复杂,我又在简历上写了快速上手),我本来就了解个大概,简历里并不是在吹牛,毫无问题地就解释完了一套流程。
然后对面问了一个问题,由于项目中存在一个数据库读到另一个数据库的过程,那么怎么保证在数据的传输中,不丢失信息?然而我确实没有这方面的经验(公司封装好了所以没有接触到底层过),就说不知道……但是如果是我的话就加个校验码啥的。

做题环节

然后就开始做题,很简单地写了一个快排。
写完后问我,如果这个是个API,被人使用的话,还需要考虑到什么东西?因为写得很简单,我完全想不到有什么东西需要被额外考虑……只说出了考虑进来的数组是空的什么的。
然后就让我写TC,我写了一个数组为空,一个数组只有一个数字,一个常规正数数组,一个包含负数的数组。
然后就是让我用自己写得TC过一遍我写的代码的流程,过到一半我发现有个地方写错了(低级错误那种),就在我讲解的过程中迅速改掉了。
最后对方告诉我,其实前面说的就是要考虑输入的i和j为负数的情况,我恍然大悟。
接下来就是问对方的问题,例行提问就没啥好说的了。

总结

总体感觉在电话面试中表现得一般般……感觉有问题都没答上来,铁定过不了了orz没想到后续收到了onsite的面试邀请……虽然感觉很难面进去,于是抱着学习和增长经验的心态去了……

第一轮onsite

做题环节

和电面时候的面试官是同一个,所以对我还算比较熟悉,于是没有问简历相关,直接上来就是做题。

第一题

设计一个从json转换为csv格式的系统,你会怎么设计,你觉得要考虑什么问题。

听到这道题我其实是懵逼的……没想到会出设计题目。
我:那我觉得要考虑文件很大的情况,会溢出。所以我们要分段输入。
面试官:那你要怎么分段输入呢。
我(因为真心没概念,所以开始胡扯):嗯……就是把读入的东西全都存成char[],然后一直读入,如果数据量超过了预设的大小,并且判断已经是可以中断的情况({}包起来的情况),就先暂时处理这一批,并且存一下读到哪里了,便于下一波的读取。
面试官:那你稍微写一下你设计的接口吧。
我写了readjson(),handledata(),converttocsv(),然后写了一个处理的大致流程。
(此时已经开始发慌了orz,因为我觉得我胡扯的什么读到{}就可以停止完全站不住脚,毕竟分不出读到第几层json嵌套,既然如此之后准备怎么拼接之类的……)
然后面试官问了挺多细节的问题(比如可以json套json,那么格式要如何处理等),最后让我写一下按照我的设计,会转换成一个什么样子。我稍微写了一下,这道题就姑且算是过去了。

第二题

给一个字符串,再给一个int数字,输出转换后的字符串结果。如:输入:asdb, 1 输出:sdba; 输入:asdb, 2 输出dbas。

一道很简单的题目,而且有了电面的经验,我非常注意边界问题。所以我把重点都放在了这上面。比如考虑了int = 0的情况,int = s.size()的情况等等。
这道题面试官基本没什么问题,让我写了一下TC,然后点了点头就算结束了。

第二轮onsite

问答环节

上来一个英文自我介绍……还好只是自我介绍一下,并不是全程英语面,不虚。
然后问了一下我工作中使用的系统的大致架构,我画给了面试官看了一下,解释的还算清晰,面试官也基本没有表示出多少问题。

做题环节

第一题

实现一个string转int的接口,大前提是要给全微软的员工使用,所以请考虑得更全面。

题目本身不难,所以我主要精力花在了考虑特殊case,比如string里面不是数字,还要额外处理第一个字符串是+或者-的情况,字符串溢出的情况。
其中写得时候出了一些低级问题(前面判断了正负结果return的时候没用),在面试官的提示下改掉了。
判断字符串溢出,我使用的是long long和int比较,如果相同证明没有溢出。

于是面试官问我,那你这样的话,每次都要比一次,算好多遍,有没有别的更好的方法?
我苦思冥想,由于不太了解溢出的behavior,我想到了判断正负,但是被我pass了,因为觉得一个极大数字X10,溢出的话并不一定是负数。所以我就说我暂时没有想到。
结果面试官告诉我,就是判断正负,于是我就问,我前面也想到了这个,但是却被我否定了,因为我不太确定一个INT_MAX乘10,溢出的话一定是负数吗?他说那这个需要了解数据存储的方式了。我说好吧,我回去查查。

然后就是写TC,考虑一下边界问题,然后尽力写全面就行了。
写得过程中,我忽然想到,为什么开头不能是多个“+”呢?那不也代表是正数吗?于是我就提出了我的想法,面试官估计没想到我想法这么跳跃……就说你的想法有道理,不过这种可以定义为非法嘛,况且多个“+”按照道理也不对啊。

第二题

当int=1, 输出(),当int=2, 输出 ()(), (()),当int=3,输出 ()()(),()(()),(())(),((())).

这道题吧……我感觉递归肯定不是最好的方法,然而我当时只想到了递归……愣在那就想了半天有没有其他方法,这种事情真的是越想越慌张,越慌张就越想不出,无奈之下,我只能写了递归。
刷刷几笔写完之后,我感觉对面肯定不满意了,赶紧解释一下我觉得肯定有更好的方法,但我暂时只想到递归。
面试官:没事,我们先把题做对,再考虑优化嘛。

然后就稍微解释了一下我的思路,大体没有问题,问了一些比如准备怎么去重复等等,我就回答要不就是搞个map,或者存在一个不会有重复数据的容器里面。
后来就开始优化了,然而当时真的大脑空白,只能勉强靠着基础提出了一个最弱智的压栈代替递归的方式。
总体来说,这题答得我自己都很不满意,面试官也是考虑到时间问题才停止了发问。

第三题

假设现在大家要出去outing,设计一个投票系统,让最终选择出的结果令大家都比较满意。

听到题目我的第一反应是为啥不能直接投票取最高呢?
我提出了一个方案,就是大家能选0-3个想去的地方。然后想了半天不知道该往什么方向优化,就厚着脸皮问面试官,为啥不能取最高呢?你觉得会产生什么样的问题呢?
面试官:比如有一个人特别想去某个地方,他就让整个team的人帮他投那里,同时有三四个人特别不想去那个地方,但是这没用,最终的结果还是那个地方,你这个方案就不是大家都满意的了,最终其实只有一个人很满意,大部分人无所谓,三四个人很不满意。
我:你说的对……那我觉得需要加一个特别不想去的地方的选项,同样也是可以选0-3个。最后一个地方的分值取决于(想去的-不想去的)。如果最后(想去-不想去)存在相等,那么就取想去的人最多的。
其实我最后半句话就是随便定的,并不存在什么道理,因为如果分数相同,那么想去的人最多也就代表不想去的人也是最多的了。现在仔细想的话,我觉得应该根据team进行加权打分的。

在我们的讨论之下,这道题就这么过去了,面试官还对我说,其实这道题不存在什么对错,只是稍微探讨一下。

第三轮onsite

这轮是manager,而且这位manager非常懂技术,亚历山大。

问答环节

一开始问我,前两轮面的咋样啊?我老实地说,感觉一般般,两轮都有问题没答上来。(为什么当时我会这么回答?脑抽了?)
然后就是聊聊自己希望的工作环境,你能带给微软什么?微软又能带给你什么?
稍微表示了一下希望工作和同事的氛围比较友好,老大不会打击我说我应该学对工作有帮助的东西之类的。
然后聊了聊自己最满意的项目,老一套了,我就稍微说了一下。

然后他问我,既然你说你业务时间喜欢学点东西,那都是学的什么呢?
我说就是没事可能刷刷题,或者觉得有什么好玩的想到就做一下。

然后介绍了一下我搞得微博爬虫,其实就是个小玩具orz但是最近都在学习ML之类的,没什么拿得出手的了。
稍许介绍了一下用的是python的什么包,他问我,这个包很基础的啊,没考虑过换个别的包吗?大窘……我这还真没考虑过,于是就说因为当时就是在谷歌百度搜过啦,一开始看的是从零开始学爬虫,然后教程里就用的这个,因为能用,我就一直用下来了……
然后就是一些具体细节,比如这个项目遇到了什么坑?我就说了一下cookies和对前端的代码(比如js)不熟,很是研究了一段时间。

做题环节

第一题

一个冒泡排序。面试官说他喜欢先从简单的开始。
然而,天知道为什么,我居然写了大半天…………而且最后使用TC过流程的时候,还发现i和j的遍历条件写错了,低级错误orz

第二题

24点。

我:目前只想到了穷举法。思路是穷举4个数字和4种符号。
面试官:那你觉得需要重点考虑的是什么情况。
我:主要是加减和乘除的优先级问题。情况会很复杂,不能直接从左到右计算。

面试官:那你列一下有多少种可能性吧。我们先不考虑数字的顺序,只考虑符号的。
我稍微列了一下,发现真的很多……写了四分之一的时候,经过面试官的提示,发现漏考虑了有括号的情况。
因为感觉写得有点点乱,面试官提示可以把加减用一个符号表示,乘除也用一个符号表示,这样就只剩两种符号了。然后再加上括号来列出可能性。
写了一会,觉得这样表示起来也很乱,不好弄,面试官又提示可以用树来表示,看上去会比较清楚。
于是我又用树来表示了所有的可能性,写完了五个,感觉应该没了,面试官问写完了吗?我顿时方了,仔细验证了一下,又确实觉得都举出来了,就弱弱地说,我觉得没了呀……面试官说,哦哦我就是问一下,不是质疑。我汗……

这段的思路我全程被面试官牵着走……orz

然后是例行的TC+提问,还要考虑有什么问题存在?使用了老一套的边界问题(0,负数,输入参数不是4个等),结果行不通,面试官表示这并不是他所担心的。
面试官:你刚才写得这些都是单元测试,那么除了单元测试之外,别的更高level的呢?
我:集成测试?压力测试?
面试官:和压力测试很像的一个测试。
我(努力思考了很久):暂时想不出……

后面发现已经超时了,面试就结束了。

三轮onsite总结

三轮里基本都有回答不出问题的情况。
前两轮的话,主要是因为对于设计系统,把握整体,考虑全面方面比较薄弱。但是这两轮我已经尽力发挥了,所以我对于自己的表现已经很满意了,只是以后对于系统设计方面需要多思考。
最后一轮由于面对的是manager,莫名紧张,而且最后一题难度比较大,整体表现都不算很好。对于这一轮,我的发挥并没有让我自己表现出最佳的一面,主要是心态的问题,可能这就是传说中的压力面吧,相信以后有了心理准备会更好。