微软CMD Software Engineer暑期实习
去年元旦前投递的提前批,不过并没有等来面邀,转入了正式批。
- 笔试(1.22):笔试链接下发后的48小时内自行选择时间开始,时长2小时,leetcode模式。3题,题目是英文的,比较长,我写了一下题目的大意:
(1)给定一个非递减的正整数的数组,通过「新增」或「删除」操作得到一个新数组,其中每个值X刚刚好出现X次,请问至少要多少次操作?
eg.
Input: [1,1,3,4,4,4]
Output: 3
解释:给定[1,1,3,4,4,4],需要至少3次操作:删除一个1,删除3,新增一个4
(2)未来10天(编号为0-9)可以举办两场活动,给定所有员工再未来10天的有空日期,请问最多有多少员工可以参加至少一次活动?
eg:
Input: ["039", "4", "14", "32", "", "34", "7"] // 第0个员工未来第0、3、9天有空
Output: 5
解释:第3、4天举办活动,则员工0、1、2、3、5这5个员工可参加活动。
eg.
Input: [1,1,3,4,4,4]
Output: 3
解释:给定[1,1,3,4,4,4],需要至少3次操作:删除一个1,删除3,新增一个4
(2)未来10天(编号为0-9)可以举办两场活动,给定所有员工再未来10天的有空日期,请问最多有多少员工可以参加至少一次活动?
eg:
Input: ["039", "4", "14", "32", "", "34", "7"] // 第0个员工未来第0、3、9天有空
Output: 5
解释:第3、4天举办活动,则员工0、1、2、3、5这5个员工可参加活动。
(3)给定一个可能含有重复数字的整数数组,问包含所有元素的最短子数组(需要连续)长度。如果某个元素出现多次,它只需要在子数组中出现至少一次即可。
eg.
Input: nums = [7,3,7,3,1,3,4,1]
Output: 5
解释:最短的子数组是nums[2,6],即[7,3,1,3,4],其长度是5
eg.
Input: nums = [7,3,7,3,1,3,4,1]
Output: 5
解释:最短的子数组是nums[2,6],即[7,3,1,3,4],其长度是5
- 一面(2.21)
自我介绍
聊项目,面试官似乎对项目没什么问的,就问遇到了什么问题怎么解决
做题:
(1)搜索旋转排序数组
(2)洗牌(和lc打乱数组差不多)
由于这两题我都做过,再讲算法思路和写代码的过程都比较流畅。面试官也对我的算法基础表示了认可。
反问环节:就问了一下团队氛围怎样
- 二面(2.22)
面试官是个姐姐,她上来先简单介绍了一下他们组,然后才开始面试。
自我介绍
聊项目,也只是针对项目一个点进行了提问
做题:
汉诺塔。
这个问题很经典了,不过本科当时上算法课的时候玩手机睡觉去了,没咋听,突然面试遇到还有点慌,我大概说了一下思路讲到要递归分治,然后就写代码,尽管还不清楚具体如何写,但我还是一边写一边讲我的想法,当我卡顿不知道该怎么进行下去的时候,主动向面试官要了一点提示,然后才继续写完。写完经过测试,终于算是通过了。
由于做得慢了些,这次就只做了一题
反问:问了由于我写得慢,只做一题,是否对面试结果影响很大?面试官:能在一定提示下写出来也是可以的,后续应该会有hr联系你终面
- 三面Lead面(2.25)
和二面一样,面试官也是上来先对他们团队做了一下介绍,然后说了一下本轮面试的流程,然后就开始了
说一下自己的经历,我就介绍了一下项目,先问了遇到什么问题如何解决,追问了sql注入的东西
做题:
从倒数第n个节点反转链表
链表的题一看就会,一写就废(可能也还是比较菜了吧),其中一处细节有问题,debug了一会儿然后才通过自己写的测试用例。
反问
总结:我全程下来都是中文交流,也没有八股,觉得还是看重算法,写算法的过程除了考察你的基本功,还要需要你和面试官进行交流,让她(他)能明白你到底在写什么,这样一方面如果你会这题才能让面试官觉得你思路清晰,你不会这题也能方便他明白你的思路并在适当时候做出一点提示。
ps:首次发面经,也是攒攒人品。许愿offer!