写一篇头条的面经,记录一下…… 众所周知, 头条注重算法,笔者从一开始的 leetcode 00, 啥都不会,到现在可以 hold 住大部分的简单题,在文末总结了算法刷题的思路,希望对你有用。
记住 3 个关键点
请求是并发执行的。
用一个计数器记录,等全部的异步接口都返回时就 resolve
返回的结果必须按照输入的 fn 顺序存储
股票系列问题有很多, 这道题的细节是“可以买卖无数多次”,那么用“贪心算法”即可。
集成化开发是怎么搞的
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 分钟就收到了二面的通知。头条的效率真的很不错。
输入:[2,1,4,7,3,2,5] 输出:5 解释:最长的 “山脉” 是 [1,4,7,3,2],长度为 5。
理解题目理解了很久...实际实现起来并不难,就是很难理解
首先, 最长的山脉:指最长的 2 个坡底之间的距离。
那么这道题的解决思路就出来了。
使用双指针分别从左右两边开始平移,找到第一个 坡底 即可
坡底:2 种情况,一种是左右 2 边都比它大,一种是在边界处,下一个值比它大。
场景题:一个页面有很多很多个数据,怎么让它不卡顿?
虚拟滚动
分片渲染
……
git eslint, 这些要怎么集成,写脚本?如何设置警告值,加邮件提醒?
运维这边,前端是如何发布代码的?
node 的 qps 是多少?为什么这么设置?
日志多的情况,如何处理?
babel 细节
其他的就是聊我做过的项目了。还有一些细节题目,忘记了哈哈。
总体感觉:二面面试官比较关注系统层面的东西,怎么部署,一整链路是怎么样的……有些时候我有点难 get 到面试官想考察的点,他也会逐步引导。很温和很强的大佬。不知不觉就跟面试官聊了 2 个多小时,然后面试官约的会议室到点了哈哈,然后就结束了面试。
三面这个就很凶残了,幸好脸皮厚,不然我要怀疑人生了。
你做过小游戏?介绍一下
连连看小游戏?那你手写一个吧
(内心活动:???黑人问号,压力面也不是这样的吧)表面客客气气:需要全部手写出来?还是写一个大概的框架?
你就写出来就是了?
(怀疑人生的我,开始写起了代码)
定一个框架,定好 game 类的入参(类型),写好 draw 绘制 canvas 的方法,判断是否连线成功, 消除方块
那你个这个连线逻辑怎么判断?
连连看最多只能 2 个拐点,我只需要分 3 种情况,一个拐点,2 个拐点,没有拐点的情况。
那你写出来,你别说。
好吧…… 你要不要看看我之前写得文章,还有动图哦。(笑哭)
过了好久,面试官终于放过我了。聊项目聊聊聊。
你了解 koa 中间件么?
手写一个 koa 中间件。
为什么要跳槽?
职业规划
总体感觉:压力面,没有一丝微笑,总体聊了 40 分钟的样子。第二天就 hr 面了。效率真的杠杠的
头条其实,非常考察算法能力。顺路总结下如何从一个算法小白菜,到可以 hold 住大部分的 easy 题。
leetcode 网站[1]光看不练都是假的,这个网站的刷题顺序。先刷右上角的剑指 offer
一开始看着贪心算法,动态规划,bfs,dfs 可能会觉得,好像好高级的样子,其实弄懂之后,就跟一个名词一样。可以一天吃透一个解题的类型。举一反三。不要觉得难,一步一个脚印就好了~
评论区真的很多大神,还有各种动画,所以建议大家打开对应的题目,多看看大神的解法,自己动手写一遍。下面只做一些题目的枚举和归纳分类。
合并两个有序链表[2]
旋转链表[3]
说到树,先理解 dfs (深度优先搜索)和 bfs (广度优先搜索)
广度优先算法:(以一个波浪一样一层一层向外广播)
深度优先算法:(一直访问到子节点,然后再回到父节点)
很多题目都是基于 dfs 和 bfs 的变形,所以先吃透 dfs 和 bfs ,再去刷题。
二叉树的中序遍历[4]
二叉树的最大深度[5]
路径总和[6]
首个公共祖先[7]
重建二叉树[8]
核心思路:[利用哈希表]
遍历数组 nums,i 为当前下标,每个值都判断 temp 中是否存在 target-nums[i]的 key 值
如果存在则找到了两个值,如果不存在则将当前的 (nums[i],i) 存入 map 中,继续遍历直到找到为止
两数之和[9]
三数之和[10]
买卖股票的最佳时机[11]
一般只考察一阶动态规划,从结果推起,推导出一个公式。
看到一个段子:如果你遇到一个面试官给你出了个三阶动态规划,你就放弃把,因为面试官很怕你做出来。
爬楼梯[12]
三角形最小路径和[13]
动态规划的题很多很多,可以慢慢悟,等到灵光一闪,你就懂了
位 1 的个数[14]
目前已拿到头条的 offer,薪资方面也比较满意,不过考虑到个人追求,最终还是选择了阿里。希望一切顺利~~~ 希望这篇文章对你有用~ 点赞转发~
参考文献
极客时间《数据结构与算法之美》
[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 亿个整数排序?如果觉得文章不错,帮忙点个在看呗