微软面试算法题总结

Leecode 84

 

第一题是数字三角形找最大和路径                             (容易题)

第二题是二叉树中找两个节点的最近公共祖先节点   (最近公共祖先)

 

给定二叉树中的特定节点中序遍历后的下一个节点 (剑指offer)

 

 

Leetcode 124 最大路径和


 

做题       (并查集)

有n个二维平面上的点和距离d,将它们分成k组。

若两点间的距离小于等于d,则这两个点在一组;如果点A和点B在一组,点B和点C在一组,则点A和点C在一组。

算法返回每个点所在组的编号(0..k-1)

 

4.最长回文子串
5.中序遍历的下一个子节点

 

单链表逆序
二进制转十进制,考虑溢出

二叉树:当前节点的值更新为当前节点所有子节点的值之和(递归和非递归)


 

一面

比较顺利,是一位在微软刚刚工作两年的小哥,比我大不了几岁。

可能他是第一年面试别人,他挺紧张的还,哈哈哈,上来他先给我来了个自我介绍,讲了一下部门工作,然后问我要不你也自我介绍一下?

哈哈哈,中文自我介绍的,简单聊了聊项目,开始正篇

 

编程题,纯白板

套了一个情景题的壳,本质上就是自己写一个 优先级队列。磕磕绊绊的写出来,中间他一看到我在思考就不断问我是否被block住了,然后就要给我解释应该是怎么做,,,(我内心想,我明白我明白,但我得好好想想着。。。233)写完最后还得到了夸奖,说我他面试的几个里面写的最好的一个,然后跟我讲一下要注意下代码风格,一面就很顺利的过了。

 

二面

自我介绍,简单聊了一下项目,正篇

网页打不开所以是在自己的IDE中写的;这个面试官不喜欢说话,全程也没有交流

编程题:1)矩阵转置;(写的很容易,但是写完之后要我改变量名,说写的太不规范了。。尴尬了)

2)输入纯数字的字符串,输出转化成字母的所有可能的字符串;(写了挺久的,还debug了好几分钟,最后写出来了也,但由于时间问题他也就没细扣代码细节,反正写的比较丑)

 

最后又问了我一个数据库迁移的问题,讲的是先关闭服务,然后再导出导入sql文件;进阶又问我如何在线实现数据库迁移,回答的不太好;

 

大约一周后收到了感谢信。应该是笔试太差了,另外微软比较注重代码风格!

 

投的北京STCA暑期实习,非内推,参加了笔试

 

一面:

自我介绍,项目介绍,然后问了一个BST树的某节点删除,还有一个最简单版的股票问题

 

二面:

自我介绍,项目介绍,问题是在排序数组中用二分查找找到某数字的第一个位置,然后可能是看我编程水平差,问了一个逻辑相关的推导问题。

 

面试官态度都超好,就是菜鸡编程能力太差,面试官给了各种提示才做出来。继续刷lc吧

目前只有一二面,有点凉,许个愿


 

29号第一轮平行面:

1.自我介绍

2.项目介绍

3.手撕代码

1)中序遍历二叉树非递归实现

2)整型数组中找出所有目标和三元组

不得不说微软的面试真的太舒服了,表白面试官小姐姐!超级无敌温柔,声音也太好听了

 

更新:

30号第二轮面试:

听说第一轮平行面过了的话就可以直达lead面,不知道自己昨天一轮有没有过,邮件上也没写,所以也不知道今天面的是第二轮平行面,还是对面坐着的是leader

 

面试官一上来就问昨天面试都被问了什么?然后就直接开始手撕代码了

1)二叉树的最近公共祖先

剑指offer的题, 磕磕绊绊,写起来不太顺ㄒoㄒ

最后要求写测试用例。

整个过程30分钟,表现不太好。


 

一面2020年4月13日

自我介绍

算法题:实现一个类似于整数流的类,每次调用next()方法时会传进去一个数字,并返回最近传进去的三个数的平均值。要求只能使用数组实现。

stream.next(4); //return 4

stream.next(6); // return 5

stream.next(2);// return 4

stream.next(1); // return 3

使用循环数组来实现一个队列,记录一下开始结束位置,并用一个sum来存当前的和,这样可以做到时间复杂度为O(1)。

数学题:现在有一个M*N的点阵,问从左下角走到右上角的最短路径一共有多少条。只能上下左右移动。没有障碍。

我答的dp,面试官说没有问题,不过不需要那么麻烦,应该是Cm+n-2 n-1条路径。最短路径只能向右向上走,而最短路径的长度一定为m+n-1所以可能的选择就是从这些可能性中选出那些向上或向下走的路径。

 

二面2020年4月29日

讲项目(竟然没有自我介绍)

算法题:给一个不含重复元素的数组,如果该数组满足下面两个条件中的任意一个,就返回true,否则返回false;

条件1:如果在该数组中可以找到两个数字使得交换这两个数字后的整个数组变为升序,那么该条件满足。

条件2:如果该数组中可以找到一个连续的子数组使得反转这个子数组后整个数组变为升序,那么该条件满足。

在面试官的引导下,先沟通了思路,最后算是写出来了,就是有点儿小bug,还有有些地方代码可读性较差。原因就是当时先写出来一部分发现逻辑不太对,就在原有的基础上加补丁,这样代码就会越改越乱。面试官也提到了这个问题,说如果写出来发现有些corner case没有覆盖到的话最好是把之前推翻了重新想一下,这样写出来的代码才会简洁明了

 

 

4月29日第一面:

自我介绍。
因为没什么项目就简单问了几句。
接下来是编程,分享屏幕之后我在记事本里面写的。
第一题是非递归中序遍历二叉树,最开始手滑写成队列了,写了一阵全删了改成栈,没有测试,写完面试官直接把代码拷走了,面试结束之后我手动测了一下,这题是Bug Free。
第二题是LeetCode 26,三数之和,写完之后也是直接拷走代码,面试结束之后调了一下有三个Bug。

4月30日第二面:

自我介绍。问了一些个人情况有关的内容。
这次的编程题是给了一个类似LeetCode Playground的平台,可以在线运行。

第一题是给定一个数组,求数组当中的峰值,所谓峰值就是这个数比他左右两边的数都大。
确定了边界条件和要求之后,最开始打算写一个O(N)的算法,写了不到半分钟面试官说写尽可能快,我就换了一个分治的方法。
面试官问我时间复杂度,然后说不考虑相等的情况下能不能更快,我说可以写一个确定性的对数级别算法。
写完之后自己出样例调试,这题是Bug Free

第二题是给定一组用户和每个用户的好友列表,输出每个用户之间的共同好友的关系。比如A与B有3个共同好友,就输出A,B: 3
我问有多少数据量,面试官说可以认为数据量极大,一次性读不进来,可以用中间文件存储结果。
最开始没想到好方法,经过面试官提示说每行读一遍就行,我立刻想出了解决方法,这题面试官没让我写代码。

第三题是给定一组数字,然后把数字分为三组,其中两组总和相等,要求第三组的总和尽可能小。
面试官一开始就提示是动态规划,我说了一个最朴素的暴力解,面试官让我想想更快的解法,想了好几分钟没想到,面试官让我先写暴力解,没测试,说代码应该没问题,然后面试官告诉我了一个更快的方法。

 


 

两面均是全中文,面试工具是微软自家一个远程会议工具,写代码会让共享屏幕,听说可以不开视频,所以二面我没有开视频也没啥问题。

 

一面:

自我介绍

介绍项目

让我共享一个记事本,我共享了一个notepad++

题1:单例模式。

忘了,没写出来。。

题2:给一些区间,要求这些区间如果有交集的要合并,返回合并后的区间集合。

思路:所有区间按左端点优先排序,扫一遍即可。

一开始题2想错了,以为是按右端点优先排序,写完代码才发现错误,不过改完后代码应该是正确的。

写完代码,没有编译,面试官说应该没有问题。

问面试官问题。

全程40分钟不到。

 

隔了一两周。。

二面:

二面是个超级温柔的小哥哥。

自我介绍

分享一件困难的事

数据库4个特点(ACID)

数据库4个隔离级别

数据库脏读、重复读、幻读

举例生活中用到锁的例子

分布式系统中如何定位某一个用户数据的位置

分享屏幕,自己选一个编辑器

题1:枚举子集

思路:二进制枚举

题2:给一个数组,求所有连续子序列的最小值的和

思路:对于每个点a[i],维护一个l[i]和r[i],分别表示包括i这个点的合法子区间最左和最右能到达的点,答案是ans+=a[i]*(i-l[i]+1)*(r[i]-i+1),l[i]和r[i]用单调栈扫两遍得到。

问面试官问题

基础题多数没答出来,代码题均编译,自己编的测试样例通过。

全程1个小时

 

二面完后10分钟不到thank you letter。

 

你可能感兴趣的:(算法)