写一篇头条的面经,记录一下…… 众所周知, 头条注重算法,笔者从一开始的 leetcode 00, 啥都不会,到现在可以 hold 住大部分的简单题,在文末总结了算法刷题的思路,希望对你有用。
一面
笔试题
实现一个 promise.all
记住 3 个关键点
请求是并发执行的。
用一个计数器记录,等全部的异步接口都返回时就 resolve
返回的结果必须按照输入的 fn 顺序存储
买卖股票的最佳时机
股票系列问题有很多, 这道题的细节是“可以买卖无数多次”,那么用“贪心算法”即可。
二维矩阵
![](https://i-blog.csdnimg.cn/blog_migrate/c1ca3ebf75e019e2bf99b2da780f1bf0.png)
面试题
集成化开发是怎么搞的
git hook 钩子脚本,jenkin 设置自动化构建触发方式,编写脚本..
traivs 集成了解么?
taro 组件化开发
单元测试一般你使用哪些方法?
快照的原理了解么?
e2e 自动化测试是什么?
e2e 是事件驱动吗?
tree shaking 他是怎么实现的?
react 怎么做优化呢?
减少页面渲染的次数, purecomponent , memo 记忆化组件
react fiber 分片
dom diff 的一个优化
react loader 的一个异步
react hook 的优缺点
useCallback 和 usememo 什么区别
react 函数式组件和类组件什么区别差异
webpack 做了什么优化
体积方面的优化: 压缩啊, 动态 polyfill,分包,tree shaking,延迟加载 js ……
构建速度方面的优化: 多进程打包,大型库外链,Dllplugin 将库预先编译 ,减少构建搜索或编译路径,缓存 bable-loader cache
分包,怎么分包,同步和异步你记得吗?
多进程编译?怎么实现的你了解么?
容灾怎么搞?
接口级容灾,模块级容灾,页面级容灾,404,还有 cdn 处理
那 nginx 那块的容灾呢,了解么?
nginx 怎么做负载均衡的
除了用 nginx 做过这些, 还设置过什么?
说出一个网站从输入到回车到页面渲染出来的样子. 这期间可以怎么做优化?
只答了熟悉的几个阶段
dns 解析阶段 预解析
建立 tcp 三次握手 链路复用 keep-alive
url 解析:是否命中强缓存,协商缓存等等
页面呈现: 解析 HTML,解析 css,合并 dom 树和 css 规则,生成 render 树,布局 render 树,负责各元素尺寸,位置的计算.绘制 render 树
总体感觉:一面聊得还是比较开心的,感觉一面面试官比较关注集成方面的东西,自动化测试如何集成等等……
刚结束 5 分钟就收到了二面的通知。头条的效率真的很不错。
二面
笔试题
下面输出了什么?
知识点:var 变量提升, let 暂时性死区
求最长的山脉
输入:[2,1,4,7,3,2,5] 输出:5 解释:最长的 “山脉” 是 [1,4,7,3,2],长度为 5。
理解题目理解了很久...实际实现起来并不难,就是很难理解
首先, 最长的山脉:指最长的 2 个坡底之间的距离。
那么这道题的解决思路就出来了。
使用双指针分别从左右两边开始平移,找到第一个 坡底 即可
坡底:2 种情况,一种是左右 2 边都比它大,一种是在边界处,下一个值比它大。
求树的路径之和 (dfs 搞定)
![](https://i-blog.csdnimg.cn/blog_migrate/1a9691a049016fb34d99e0bb45a2b99e.png)
面试题
场景题:一个页面有很多很多个数据,怎么让它不卡顿?
虚拟滚动
分片渲染
……
git eslint, 这些要怎么集成,写脚本?如何设置警告值,加邮件提醒?
运维这边,前端是如何发布代码的?
node 的 qps 是多少?为什么这么设置?
日志多的情况,如何处理?
babel 细节
其他的就是聊我做过的项目了。还有一些细节题目,忘记了哈哈。
总体感觉:二面面试官比较关注系统层面的东西,怎么部署,一整链路是怎么样的……有些时候我有点难 get 到面试官想考察的点,他也会逐步引导。很温和很强的大佬。不知不觉就跟面试官聊了 2 个多小时,然后面试官约的会议室到点了哈哈,然后就结束了面试。
三面
三面这个就很凶残了,幸好脸皮厚,不然我要怀疑人生了。
你做过小游戏?介绍一下
连连看小游戏?那你手写一个吧
(内心活动:???黑人问号,压力面也不是这样的吧)表面客客气气:需要全部手写出来?还是写一个大概的框架?
你就写出来就是了?
(怀疑人生的我,开始写起了代码)
定一个框架,定好 game 类的入参(类型),写好 draw 绘制 canvas 的方法,判断是否连线成功, 消除方块
那你个这个连线逻辑怎么判断?
连连看最多只能 2 个拐点,我只需要分 3 种情况,一个拐点,2 个拐点,没有拐点的情况。
那你写出来,你别说。
好吧…… 你要不要看看我之前写得文章,还有动图哦。(笑哭)
过了好久,面试官终于放过我了。聊项目聊聊聊。
你了解 koa 中间件么?
手写一个 koa 中间件。
为什么要跳槽?
职业规划
总体感觉:压力面,没有一丝微笑,总体聊了 40 分钟的样子。第二天就 hr 面了。效率真的杠杠的
头条其实,非常考察算法能力。顺路总结下如何从一个算法小白菜,到可以 hold 住大部分的 easy 题。
一.刷题网站
leetcode 网站[1]光看不练都是假的,这个网站的刷题顺序。先刷右上角的剑指 offer
![](https://i-blog.csdnimg.cn/blog_migrate/1f4e1236c8aa6a039d3cea7b24e89b87.png)
二.系列题目
笔者将题目粗浅的分为下面几种类型:解题思路有以下几种方式:
![](https://i-blog.csdnimg.cn/blog_migrate/3044b8d4677e9f3c16507db7e3ac5fa9.png)
一开始看着贪心算法,动态规划,bfs,dfs 可能会觉得,好像好高级的样子,其实弄懂之后,就跟一个名词一样。可以一天吃透一个解题的类型。举一反三。不要觉得难,一步一个脚印就好了~
三. 实战题目
评论区真的很多大神,还有各种动画,所以建议大家打开对应的题目,多看看大神的解法,自己动手写一遍。下面只做一些题目的枚举和归纳分类。
1. 链表
合并两个有序链表[2]
旋转链表[3]
2. 树
说到树,先理解 dfs (深度优先搜索)和 bfs (广度优先搜索)
广度优先算法:(以一个波浪一样一层一层向外广播)
![](https://i-blog.csdnimg.cn/blog_migrate/f26ad1b0f979da2ef226f03568d47b84.png)
深度优先算法:(一直访问到子节点,然后再回到父节点)
![](https://i-blog.csdnimg.cn/blog_migrate/f2d5187524f7f7e553fbb0755296bd89.png)
很多题目都是基于 dfs 和 bfs 的变形,所以先吃透 dfs 和 bfs ,再去刷题。
二叉树的中序遍历[4]
二叉树的最大深度[5]
路径总和[6]
首个公共祖先[7]
重建二叉树[8]
3.两数之和,三数之和
核心思路:[利用哈希表]
遍历数组 nums,i 为当前下标,每个值都判断 temp 中是否存在 target-nums[i]的 key 值
如果存在则找到了两个值,如果不存在则将当前的 (nums[i],i) 存入 map 中,继续遍历直到找到为止
两数之和[9]
三数之和[10]
4. 股票系列
买卖股票的最佳时机[11]
5. 动态规划
一般只考察一阶动态规划,从结果推起,推导出一个公式。
看到一个段子:如果你遇到一个面试官给你出了个三阶动态规划,你就放弃把,因为面试官很怕你做出来。
爬楼梯[12]
三角形最小路径和[13]
动态规划的题很多很多,可以慢慢悟,等到灵光一闪,你就懂了
6. 位运算
位 1 的个数[14]
目前已拿到头条的 offer,薪资方面也比较满意,不过考虑到个人追求,最终还是选择了阿里。希望一切顺利~~~ 希望这篇文章对你有用~ 点赞转发~
参考文献
极客时间《数据结构与算法之美》
leetcode题目链接
[1]
leetcode 网站: https://leetcode-cn.com/problemset/all/
[2]合并两个有序链表: https://leetcode-cn.com/problems/merge-two-sorted-lists/
[3]旋转链表: https://leetcode-cn.com/problems/rotate-list/
[4]二叉树的中序遍历: https://leetcode-cn.com/problems/binary-tree-inorder-traversal/
[5]二叉树的最大深度: https://leetcode-cn.com/problems/maximum-depth-of-binary-tree/
[6]路径总和: https://leetcode-cn.com/problems/path-sum/
[7]首个公共祖先: https://leetcode-cn.com/problems/first-common-ancestor-lcci/
[8]重建二叉树: https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/
[9]两数之和: https://leetcode-cn.com/problems/two-sum/
[10]三数之和: https://leetcode-cn.com/problems/3sum/
[11]买卖股票的最佳时机: https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/
[12]爬楼梯: https://leetcode-cn.com/problems/climbing-stairs/
[13]三角形最小路径和: https://leetcode-cn.com/problems/triangle/
[14]位 1 的个数: https://leetcode-cn.com/problems/number-of-1-bits/
作者:被单
关注「前端加加」, 第一时间获取优质文章.
推荐阅读1、每日一荐 2020-03 汇总2、『不要再问我头像如何变灰了,试试这几种滤镜吧!』3、LeetCode专题 - 小岛题4、一文带你AC四道题【位运算】5、或许是一本可以彻底改变你刷 LeetCode 效率的题解书6、外部排序:如何用 2GB内存给 20 亿个整数排序?如果觉得文章不错,帮忙点个在看呗