秋招去了微软面试,拿到了offer。经验分享给大家,希望有帮助。

先说我自身的情况。国内不知名双非院校本科,计算机专业。参加过ACM,最高China-Final金奖;参加过数学建模,最高国一;做过一年深度学习科研;做过大半年游戏开发;在腾讯实习四个月,做游戏客户端开发。

投的岗位是苏州的Software Engineer。事先没有笔试、电话面试环节。现场大概三十多人参加面试,女生有一半(不愧是微软)。

面试结束后半个月拿到offer。


基本流程:

  • 09:30-11:00 听两个微软的大佬介绍公司情况
  • 11:00-12:00 面试
  • 12:00-13:00 和面试官一起吃饭
  • 13:00-17:00 面试

第一轮

  • 要求先做一个英文的自我介绍。自我感觉英语还行,所以没提前准备,建议还是准备一个英文自我介绍。
  • 大致讲了一下腾讯实习做的项目
  • 白板编程: 给出 123456789 的全排列中的一个,求恰好比它大的一个。例如,给出 123456978 恰好比它大的是 123456987;给出123456789 恰好比它大的是 123456798

关于题目,在现场我写了一个奇怪的算法,把面试官弄懵了。面试官又让我再写一个他想的那种做法。

这个题目在C++ STL里有一个对应函数next_permutation。LeetCode 上有一个类似的题目 Next Permutation


第二轮

  • 面向对象的几大原则;谈对面向对象的看法
  • 设计模式知道哪些?讲观察者模式
  • 白板编程: 设计一个类,实现接口Inc(key)Dec(key)Max()Min(),要求这些操作时间复杂度都是O(1)。Inc(key) 表示 key计数加一;Dec(key) 表示key计数减一;Max() 返回目前计数最大的 keyMin() 返回目前计数最小的 key

关于题目,值得注意的是,直接使用List+HashMap是不行的,要考虑到有很多计数相等的 key 的情况。具体就不讲了,实在有问题可以私信我。


第三轮

  • 讲了一个游戏项目中用到的算法
  • 白板编程: 有一个整数序列,其中有一个数字出现一次,其他所有数字出现三次,求出现一次的那个数字
  • 白板编程: 给定一个序列 a,表示一棵树。a[i] 表示 结点 a[i] 是结点 i 的父亲。求树的深度

第一个题在LeetCode有原题:Single Number II
第二个题在LeetCode上有类似的:Maximum Depth of N-ary Tree

题都不难。我之前没遇到过,LeetCode是事后搜的。


第四轮

这一轮几乎全程英文

  • 你有什么问题问吗?随便聊(主要是为了和你用英文聊天,这样就算你提前准备了自我介绍也会原形毕露)
  • 自我介绍,中途会不停打断你,问你问题
  • 白板编程: 给一个二叉搜索树上的结点,求下一个节点
  • 白板编程: 给一个byte,求其二进制表示中1的个数,不要用循环

第一个题不说了。

第二题,先说用lowbit。面试官说,那还是有循环,要求更快。最后说的是,直接把一个byte所有情况的答案预处理了,他才总算满意。他就接着问,如果是给一个int呢?利用前面预处理的结果,分段处理(分块思想)。

然后一系列价值观问题

  • 公司的项目不喜欢你会怎么和别人说?
  • manager给的工作来不及怎么办?
  • 和别人发生争吵怎么办?