去年年底在牛客网找了Shopee新加坡的前端内推,目前已完成终面,来分享一下经验。
面试流程一共四轮:
HR电话面(简单了解情况,无技术内容):
是哪里人,为什么会选择新加坡岗位,找工作优先考虑哪些因素,为什么选择前端
第一轮技术面:
一上来先简单问了下做过项目的难点,然后顺带问了一下浏览器的强缓存和协商缓存机制。
接着是几道手撕代码题(有几题记不清了
1. 实现数组reduce方法
2. 实现如下功能:
function subscribe(func){} //接受一个函数名作为参数,订阅此函数
function unsubscribe(func){} //接受函数名作为参数,退订此函数
function elicit(){} //执行所有订阅的函数
subscribe(func1);
subscribe(func2);
unsubscribe(func1);
elicit(); //执行func2
这题只讲了大概思路,我说需要用map或数组存储订阅的函数名,退订的时候修改map或数组,最后对所有订阅函数执行一次。
3. CSS实现一个圣杯布局
第二轮技术面:
这轮考察数据结构和算法,全程就一道题手撕代码。
输入如下:
const sourceData = [
["bag", "purse"],
["purse", "hand purse"],
["bag", "backpack"],
["purse", "purse wallet"],
["purse wallet", "coin wallet"],
["purse wallet", "man purse"],
["shoe", "nike shoe"],
];
["bag", "purse"],
["purse", "hand purse"],
["bag", "backpack"],
["purse", "purse wallet"],
["purse wallet", "coin wallet"],
["purse wallet", "man purse"],
["shoe", "nike shoe"],
];
根据输入建立一个如下图的sankey diagram(类似电商的商品搜索路径图)
“bag” ➡ “purse” ➡ “hand purse”
↘ ↘
↘ “purse wallet” ➡ “coin wallet”
↘ ↘
↘ “man purse”
↘
“backpack”
“shoe” ➡ “nike shoe”
↘ ↘
↘ “purse wallet” ➡ “coin wallet”
↘ ↘
↘ “man purse”
↘
“backpack”
“shoe” ➡ “nike shoe”
要求实现一个函数返回该图的width(最长路径)和height(路径总数)。如上图的width = 4, height = 5。
我的思路是用类似树状结构存储数据,每个树节点有一个array用来存放子节点。然后用DFS遍历整棵树求出叶子节点个数即为height,用backtracking思想可求出最长路径width。
(我自定义树节点构造函数的时候有挺多语法错误,有点尴尬;面试官说我思路正确,然后点了几个可以优化的地方让我修改了下)。
第三轮team leader技术面:
终面也是技术面。上来先做自我介绍,问了一些项目经历(我项目经历真的少),问我为什么使用Django,为什么会学习React,怎样学习CSS的,学习编程语言的方法;
然后问了从在浏览器地址栏输入url,到用户看到页面发生了什么。
我说的有点笼统,然后又详细问了DOM树和CSSOM树的元素是不是一一对应的(我真不会);
浏览器先加载<script>还是先渲染页面,为什么会这样;
如果<script>有defer属性将如何执行,问我了不了解<script>的defer和async(我真不了解async);
接着问了cookie的具体存储形式,是由浏览器还是服务器端设置的,为何能保存用户登录信息(问的太细了,我真没咋准备好)。
顺带问了cookie, session storage, local storage的异同,我提到了同源,又问了一下同源是什么;
然后给了一个场景,给定一个DOM元素和一个字符串,问如何根据DOM元素的最大宽度返回能容纳的最长的子字符串(说思路即可)。
我实在不会DOM的API,面试官就给了一个Helper函数,能返回字符串在页面中的实际宽度。
然后我的想法是从后往前截短字符串,直到子字符串实际长度小于等于最大宽度。
面试官于是问了时间复杂度(O(n)?),问我如何优化;我说二分法应该可以优化到O(logn)。
又问有没有O(const)的解决方案,我当时没想出来(现在想想应该是用个map记录所有合法字符的所占宽度,然后从头扫描字符串当总宽度大于DOM元素宽度时停止,这样空间换时间应该能达到常量时间复杂度)。
接着问了我平时怎么学习新技术(我说上MDN看文档,看GitHub项目源码,大神博客),问我会不会去看CSS标准(说实话没咋看过)
问我在这个团队希望能学到什么东西,为什么;
然后就是反问环节,我水了两个问题就结束了。
总结:面试体验很好,面试官都很年轻很随和。
二面就一道题考数据结构和算法,考的挺全面的,基础一定还是要打好,各种链表二叉树BFSDFS等等都得熟练。
终面真的就是一路追问到你答不上来为止(也可能我太菜了,感觉我终面说得最多的一句话就是“这部分我没有深入了解”),千万不要给自己挖坑随便提一些不了解的知识点。
许愿能上岸吧。
祝各位也好运。
全部评论
(14) 回帖