微软SWE面经
本来已经打算从拿到的几个offer中做决定了的, 突然被微软上海(Cloud+AI)捞了简历, 于是花了几天时间准备了一下, 刚刚拿到了sp offer, 下面分享一下面试过程.
面试总共有四轮, 前三轮技术面, 最后一轮和leader聊天. 技术面一般会让你先介绍做过的一个项目, 但感觉只是走个形式, 也不会往深处去问, 重点还是做算法题的表现
一面:
- 介绍一下实习经历
- 算法题, 反转链表, 写了个O(1)空间的
-
智力题, 不用写代码, 二维平面上有一个点集P, 另外点集外有一个点P0, 现在令P中的所有点绕P0旋转,求旋转的角度为多少时, P中的所有点能与原位置重合. 我的答案是将P中的点按照与P0的距离划分成一些子集, 每个子集分别枚举可能的旋转角度, 判断是否与初始位置重合, 最后各个子集的答案求一个最小公倍数即可
- 无限位数大整数加法, 写了个大整数类, 面试官顺着我的实现问了一些基础知识, 比如vector拷贝的原子性等
二面:
- 介绍了一个简历上的项目
- 算法题: 一个元素数目不断增长的数组, 动态求数组的中位数, 用一个大顶堆和一个小顶堆实现
- 写代码实现一个Cache, 面试官顺着我的实现问了一些操作系统和系统架构的知识
三面:
- 又是介绍了一个简历上的项目
- 算法题: 一个整数数组, 将这个数组划分为一些连续的子数组, 将各个子数组内部元素进行排序后,整个数组是有序的,问最多能切成多少个子数组. 这题确实没见过, 不知道是不是leetcode上的, 我先是用dp写了个O(n^2)的, 面试官在看我的代码, 我趁这个时间又思考了几分钟, 发现这题可以用O(n)的贪心解决(对于每个缝隙, 如果前缀的最大值小于等于后缀的最小值, 那么就可以在这里切), 于是修改了答案, 面试官比较满意
- 之后问我最有把握的课程, 我说数据结构, 于是问了问二叉堆的合并问题, 回答的一般(最后得知一般的二叉堆就是难以高效合并的...)
四面:
- 最后一面是和部门leader聊天, 介绍了部门的情况, 问了一些软技能和学校表现, 自己的长处与职业规划之类的
从我经历过的十几场面试来看, 微软面试可以说是体验最好的了, 面试官的态度以及对面试者的引导方面都相当不错