[Blog] [Docs] [Code] [Slides] [About]

2020微软夏季实习面经

2020-03-13 13:00 CST

2020-03-14 15:46 CST

面试岗位:SWE-STCA-Suzhou

Day 1

上来先是简单的自我介绍(中文),然后就项目(JB-Online)问了一些问题:

  • 项目有哪些功能?
  • 运行的规模有多大?(很遗憾,只有一台服务器)
  • 是否有分布式服务?(很遗憾,没有呜呜)
  • 如何实现数据持久化?
  • 前端使用什么架构?(微妙的处于MVC与MVVM之间)
  • blabla

然后开始第一道算法题:编写一个类,其中

  • record(value)函数记录当前的值
  • average()函数返回最近五分钟内的平均值

简单的问了一些clarification,比如如何获取时间(面试官:记不得syscall就随便用个函数)

  • 思路一:使用队列,每次记录时入队,查询时循环出队。
  • 面试官提示如果时间只记录到秒,内存空间能否再优化?
  • 思路二:五分钟只有300秒,用hashing方法(当时没说出来这个词)填入数组中。查询时判断是否为最近五分钟的值即可。

剩余时间较多,然后又进入聊天模式,面试官提问:

  • 懂不懂设计模式?(懂一点但没学过)
  • 会多线程编程吗?

第二个问题我解释了一下自己的多线程编程经验,不知道答得算不算好:

  • 一种是利用并行提高运行效率的,如矩阵计算可以分块并行进行;
  • 一种是后台执行任务的,通过设置回调函数,运行完后发送信息而不阻塞主线程,如fs和XHR。

然后就开始了第二个题目:有两个线程和一个容器,线程A不断往容器中添加元素,线程B在元素个数达到5个时输出信息。

  • 看到题目我就傻了,从来没想过会出现多线程的题,开始努力回想OS到底学了些什么……
  • 思路一:使用自旋锁,线程A上锁增加元素后释放锁,线程B轮询。调度情况可能会导致线程B错过输出时机。
  • 面试官提示这道题考察的就是线程之间相互发送信息;然而我忘光了,这个提示没法get到了。
  • 思路二:添加条件变量(当时没想起来有这么回事,只好自己加一个额外变量模拟对应功能):线程A上锁写完后将ready <- false,解锁;线程B读完后将ready <- true

用伪代码实现了以上两种思路。之后面试官继续提问:

  • 自旋锁是如何实现的?实现自旋锁。
  • 除了自旋锁还有什么样的锁?(只答出来信号量,我真的傻了)
  • 这些锁之间的区别是什么?

最后问了面试官几个问题之后第一轮面试就结束了。

Day 2

上来还是简单的自我介绍(中文),然后对简历内容进行提问:

  • 去加拿大留学的具体情况blabla
  • 项目(JB-Online)用什么写的?
  • Laravel是一个什么样的框架?(好像是面试官没用过,但我也不知道怎么总结,提了一下大致的设计理念和Eloquent ORM等优点)

第一道题:两个链表表示的大数相加,面试官说写一个可以运行的程序。写的时候非常丢人各种指针乱飞,总共写了将近20分钟。写完后解释代码的内容并进行测试。

第二道题:将长度为$n$的数组分成$m$个非空连续子数组,使得最大和最小。(后来发现是LeetCode上的一道Hard题)

  • 思路一:递归查找,用Excel给面试官讲解了递归的思路,然后用C++写了,面试官还特地对递归代码的几个地方进行提问,在总结时间复杂度的时候卡壳了。
  • 思路二:二分,每次枚举最大和,判断能否分成$m$个子数组。只用Excel解释了思路,没写代码。

最后是常规的提问面试官环节。

面试感想

Microsoft的面试算法题比Google简单,但是综合难度上超难(因为Google只面算法题,哭)

<EOF>

Loading Comments By Disqus