2022苏州微软前端社招面经
面试形式:线上视频面试,使用Microsoft Teams软件,可以开启摄像头和屏幕共享。
第一轮面试
时间:2022-3-24 10:30 时长:1小时
先是英文自我介绍,然后英文交流几句,差不多十来分钟吧。我的英文自我介绍是提前准备过,背的滚瓜烂熟了,为的就是防止面试时一紧张就卡顿结巴😂。
然后面试官让我用英文介绍一下快排算法,我就随便讲了讲,其实我英文也不是很好,主要就几个关键词:quick sort, partition, two arrays, base value, less, greater, 其他副词用的语法可能都不大对。
之后问了中间件的结构,我说到了洋葱模型。
还问了TS类型enum中只有true和false的话是否等价于boolean类型,这个我说我不清楚,他说他想问的是两个对象的属性完全一样算不算同一种类型,我就说那是一样的类型,并且提到了JS是鸭子类型语言,感觉他挺满意的罒ω罒
之后又让我打开bing网站,将搜索框中的放大镜从左边移到右边
我打开了审查元素面板,发现父元素form是相对定位,那我就通过绝对定位将放大镜移到了左侧。
此时过去了半小时,然后面试官让我做个算法题,是一道按层打印二叉树的题,每换一层翻转一下打印顺序。这道题我三天前才在LeetCode刷到过,还发给同事看过,好幸运吼吼吼*^_^*
当天下午HR就跟我说第一轮面试通过了,并且面试官对我评价挺好的。第一轮通过了才能有后四轮。后面四轮面试是安排在了同一天进行。
第二轮面试
时间:2022-3-29 11:00 时长:1小时
上来就是问项目问了20分钟多,啊,累。
然后发了一个TS类型推断的题,我看了一大会,说做不出来😳
他就只能给我换个算法题做,判断一个正整数的二进制是不是01交叉序列。
我刚开始用循环判断相邻位的,做完之后,面试官有提醒我这种01交叉序列是个特殊的二进制序列,能不能利用这个优势去判断呢,然后我想到可以移位再异或,如果是二进制交叉序列,就会变成全一序列。面试官又问我怎么证明是不是全一,我说+1会变成2^N的形式,可以使用求对数判断是不是整数来证明,他说数学运算是不是会慢点呢,全一序列+1后,是不是一定为进位,我说是的,如果没进位,说明中间有个0,那就不可能是全一序列了。他又说那进位了就变成了一个1后面多个0了,此时能不能判断呢,我说可以与刚才那个全一序列与
一下, 如果结果为0,就可以证明成立了,然后他让我用代码去实现试试:
第三轮面试
时间:2022-3-29 13:00 时长:1小时
面试官先给我介绍了一下他们的team, 然后聊了聊我做的项目。
之后让我打开bing网站,和百度网站,然后随便搜索一个内容,往下滚动,可以看到百度的搜索框是固定悬浮着的,而bing的搜索框是被滚动上去了,面试官让我将bing实现与百度的同样效果。
我先看了一下百度的样式,再去改bing的。如下图。从右侧的滚动条可以看出,此时已经滚动了一截了,header部分还在顶部,我是使用position: fixed实现的,并且加了个白色背景色。然后content部分加了padding-top: 140px,否则会被header盖住一截。
我改完后跟面试官说百度的header中下面的导航“网页 图片 视频 贴吧 知道资讯 文库 采购 地图 更多”这一排不会跟header一起固定住,因为它是独立结构的,在header和content之间,百度只做了header固定。
而bing的导航“网页 图片 视频 学术 词典 地图”这是嵌在了header里面,所以我的这种实现会将导航和header一起固定。
面试官说那要怎样能实现百度的效果呢,我说那得修改html结构了,把导航单独拿出来,和header平级。
面试官说那你还有发现什么别的问题吗,或者是bing代码写的有什么问题吗。我说我刚才设置header背景色的时候不生效,排查下看到了header里面用到了background: none important!, 而在前端开发规范中,是不建议使用!important的,此外没发现别的什么问题。
之后还剩半小时,面试官给我出了个算法题,求栈的第k大元素。
我问面试官对时间复杂度有要求吗,面试官说自然是越快越好。
我定义了一个类,实现了push 、 pop、getK方法,使用一个list维护数据。push、pop就是直接使用list的push、pop方法,getK是生成一个副本数组,直接调用sort实现从大到小排序,然后返回第k个元素。
面试官问我为什么这么写,我说我直接用数组来模拟栈,返回第k大元素,就是常见的求乱序数组的第K大元素,这个最优解使用堆来维护的时间复杂度就是O(NlogN),而我直接直接排序调用系统的sort也够快。然后他问我系统的sort是怎么实现的,我说现在编程语言的sort是几种排序组合的,根据数据规模使用不同排序策略,大规模用快排或者归并,小规模用插排。
面试官说那你可以在push和pop的时候做处理吗,我想了下,说应该可以,我试试。然后我想维护有序数组,但感觉有点麻烦,又想改成有序链表,写着写着,我感觉时间不多了可能写不好,就跟面试官说我不写了吧,我跟你讲讲思路,面试官说可以。
我就跟他说我的两种思路,一种是用数组去维护一个有序结构,一种是用链表来维护一个有序结构,每个对象都存值和顺序 {val: xxx, num: xxx}这样两个值,有序结构按照对象的值排序。面试官说这两种有什么区别呢,我说时间复杂度不同。是用数组维护有序数组,根据val排了序的,在push的时候查找插入位置时间复杂度是O(logN),因为一直维护有序,所以可以二分,然后插入的