前言
23届毕业生,从一家初创公司离职已有三个月(一个小而美的公司,也是有些遗憾)。刚开始的时候觉得自己辛苦工作了这么久,想休息一下,于是便开始了一段Gap 之旅。
期间朋友想给我内推一个字节的岗位,那时候刚离职,简历没更新,个人状态也不是很好,没想着立马找工作,也不觉得自己在没有任何准备的情况下可以通过字节的面试,于是便一直拖延着,结果错失了一个机会。(现在想来有也是点后悔,不过对于那时的我来说状态确实太差了,暂且归因于没有缘分吧)
Gap 两个月后我开始找工作,发现大环境差的有点过分,投出去的很多简历都是已读未回的状态,也几乎收不到面试邀约。对于个人来说打击很大,看见招聘软件都有一种莫名的厌恶感觉。
跟朋友聊天的时候朋友劝我降低一些期望值,看到网上许多失业的朋友,也是在不断的降低期望,只求能找到一份工作。说实话,我一开始也是在不断的降低期望,但是后来我突然意识到,对于我来说,降低期望并不能让我感到安心,带来的是落差感,也有对未来职业之路的迷茫感。曾经看到一句话,在你迷茫的时候选择最艰难的路去走就对了。因为,即使在这样的大环境下,我也要逆流而上,我想进大厂。
于是乎,作为一个i人,有些羞于启齿的我开始寻求朋友们的帮助,找有工作经验的朋友帮忙投递简历,开始战斗。
写这篇文章主要是为了记录一下大厂面试和自己学习的过程。
于是迎来了腾讯的第一面,工作经验要求一年以上。先进行笔试,后开始自我介绍和面试。
关于笔试
笔试部分一共三道题,两道代码相关,一道算法相关。预计30-40分钟,实际完成大约在45分钟。
关于面试
面试大概可以分为三部分,第一部分是如何
面试大部分是问项目相关的问题,面试官会挑一些自己感兴趣的来问,也穿插问到一些知识点,占比不高。如:
你是怎样理解闭包的,它有什么作用和缺点?
产生跨域是因为浏览器的同源策略,如果没有同源策略会怎么样?
为什么Vue3 才开始有vueHooks?
笔试部分
第一题
使用Pomise /async await 实现合并多个请求为一个请求发送。
可以通过一个参数控制是否启用合并。
要求:
100ms 内持续发送的请求需要合并发送,超过100 ms 则下次合并发送。
最多合并请求数不超过20 个,完善下面代码:
export class BatchRequester{
// 需要完成
addRequest(request, needMerge = false){
}
// 发送函数,无需完成
sendRequest(requests) {
return Promise.resolve([])
}
}
// 解答
const MAX = 20
const DELAY = 100
export class BatchRequester{
constructor() {
this.start = new Date()
}
addRequest(request, needMerge = false){
let end = new Date()
let res
if(end - start >= DELAY){
this.start = this.end
res = sendRequest(this.queue)
this.queue = []
this.queue = this.queue.push(request)
}
this.queue = this.queue.push(request)
if(!needMerge || this.queue.length === 20) {
res = sendReQuest(this.queue)
this.queue = []
}
return res
}
// 发送函数,无需完成
sendRequest(requests) {
return Promise.resolve([...])
}
}
第二题
页面上有一个按钮,点击按钮发送请求,并取出请求中的指定内容,请从逻辑、风格、性能、bug 等方面指出下面代码有什么可以改进的地方。
这题代码较长,getParam 函数中的内容没能完全记住,有些不完整,这里仅列作参考。
一道codeReview 题。
<html>
<button id="btn1" onClick="clickFunction">查询</button>
<p id="text"></p>
</html>
<script>
var DOC = document
var clickFunction = function() {
var BTN = DOC.getElementById('#btn1');var TEXT = DOC.getElementById('#text')
var getParam = function() {
//...
}
var request = sendRequest((d) => {
var obj = JSON.parse(d)
BTN.innerHTML = '查询中'; TEXT.innerHTML = obj.text + getParam('text')
})
}
</script>
第三题
一共有25 匹马,有5 条赛道,每条赛道每轮只能跑一匹马,在没有计时器的情况下,最少需要跑几轮才能选出最快的三匹马?
答案是7 次
解答:
- 先跑5 轮,把25 匹马分成五个小组,5 轮跑完,可得出5 个第一名,并且把每轮的后两名淘汰掉,5 轮一共淘汰了10 匹马,还剩15 匹马。
- 再跑1 轮,把前五轮排名第一的马拿出来跑一轮。可得出25 匹马中的第一名,并且把后两名淘汰掉,由于后两名在它们之前的小组里排第一,所以后两名所在的整个小组都会被淘汰。再来看第三名,它在自己的小组里排第一,所以自己小组里排名第二、第三的马都不会比它快,所以会被淘汰。最后看第二名,它所在小组中的第三名同样不可能成为所有马中的前三,所以也被淘汰。6 + 2 + 1 = 9 ,这一轮有9 匹马被淘汰,剩6 匹马,由于第一名已经确定,所以还有5 匹马进入下一轮。
- 最后1 轮,将剩下的5 匹马跑出第一名和第二名,结合之前已经得到的最快的马,跑的最快的三匹马就被选出来了。一共7 轮。
前5 轮的结果 -> 每组的最后两名将被淘汰
1 1 1 1 1 1 1 1 1 1
2 2 2 2 2 2 2 2 2 2
3 3 3 3 3 -> 3 3 3 3 3
4 4 4 4 4 x x x x x
5 5 5 5 5 x x x x x
第6 轮
1 1 1 1 1 '1' 1 1 x x
2 2 2 2 2 2 2 x x x
3 3 3 3 3 -> 3 x x x x
x x x x x x x x x x
x x x x x x x x x x
上面的模拟过程可以用作参考。