头条面经(已拿offer, 内含算法速成方案)

写一篇头条的面经,记录一下…… 众所周知, 头条注重算法,笔者从一开始的 leetcode 00, 啥都不会,到现在可以 hold 住大部分的简单题,在文末总结了算法刷题的思路,希望对你有用。

一面

笔试题

实现一个 promise.all

记住 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 分钟就收到了二面的通知。头条的效率真的很不错。

二面

笔试题

下面输出了什么?

知识点:var 变量提升, let 暂时性死区

求最长的山脉

输入:[2,1,4,7,3,2,5] 输出:5 解释:最长的 “山脉” 是 [1,4,7,3,2],长度为 5。

理解题目理解了很久...实际实现起来并不难,就是很难理解

首先, 最长的山脉:指最长的 2 个坡底之间的距离。

那么这道题的解决思路就出来了。

  • 使用双指针分别从左右两边开始平移,找到第一个 坡底 即可

  • 坡底:2 种情况,一种是左右 2 边都比它大,一种是在边界处,下一个值比它大。

求树的路径之和 (dfs 搞定)

面试题

  • 场景题:一个页面有很多很多个数据,怎么让它不卡顿?

    • 虚拟滚动

    • 分片渲染

    • ……

  • git eslint, 这些要怎么集成,写脚本?如何设置警告值,加邮件提醒?

  • 运维这边,前端是如何发布代码的?

  • node 的 qps 是多少?为什么这么设置?

  • 日志多的情况,如何处理?

  • babel 细节

  • 其他的就是聊我做过的项目了。还有一些细节题目,忘记了哈哈。

总体感觉:二面面试官比较关注系统层面的东西,怎么部署,一整链路是怎么样的……有些时候我有点难 get 到面试官想考察的点,他也会逐步引导。很温和很强的大佬。不知不觉就跟面试官聊了 2 个多小时,然后面试官约的会议室到点了哈哈,然后就结束了面试。

三面

三面这个就很凶残了,幸好脸皮厚,不然我要怀疑人生了。

  • 你做过小游戏?介绍一下

  • 连连看小游戏?那你手写一个吧

    • (内心活动:???黑人问号,压力面也不是这样的吧)表面客客气气:需要全部手写出来?还是写一个大概的框架?

  • 你就写出来就是了?

  • (怀疑人生的我,开始写起了代码)

    • 定一个框架,定好 game 类的入参(类型),写好 draw 绘制 canvas 的方法,判断是否连线成功, 消除方块

  • 那你个这个连线逻辑怎么判断?

  • 连连看最多只能 2 个拐点,我只需要分 3 种情况,一个拐点,2 个拐点,没有拐点的情况。

  • 那你写出来,你别说。

  • 好吧…… 你要不要看看我之前写得文章,还有动图哦。(笑哭)

过了好久,面试官终于放过我了。聊项目聊聊聊。

  • 你了解 koa 中间件么?

  • 手写一个 koa 中间件。

  • 为什么要跳槽?

  • 职业规划

总体感觉:压力面,没有一丝微笑,总体聊了 40 分钟的样子。第二天就 hr 面了。效率真的杠杠的

头条其实,非常考察算法能力。顺路总结下如何从一个算法小白菜,到可以 hold 住大部分的 easy 题。

一.刷题网站

leetcode 网站[1]光看不练都是假的,这个网站的刷题顺序。先刷右上角的剑指 offer

二.系列题目

笔者将题目粗浅的分为下面几种类型:解题思路有以下几种方式:

一开始看着贪心算法,动态规划,bfs,dfs 可能会觉得,好像好高级的样子,其实弄懂之后,就跟一个名词一样。可以一天吃透一个解题的类型。举一反三。不要觉得难,一步一个脚印就好了~

三. 实战题目

评论区真的很多大神,还有各种动画,所以建议大家打开对应的题目,多看看大神的解法,自己动手写一遍。下面只做一些题目的枚举和归纳分类。

1. 链表

  • 合并两个有序链表[2]

  • 旋转链表[3]

2. 树

说到树,先理解 dfs (深度优先搜索)和 bfs (广度优先搜索)

广度优先算法:(以一个波浪一样一层一层向外广播)

深度优先算法:(一直访问到子节点,然后再回到父节点)

很多题目都是基于 dfs 和 bfs 的变形,所以先吃透 dfs 和 bfs ,再去刷题。

  • 二叉树的中序遍历[4]

  • 二叉树的最大深度[5]

  • 路径总和[6]

  • 首个公共祖先[7]

  • 重建二叉树[8]

3.两数之和,三数之和

核心思路:[利用哈希表]

  1. 遍历数组 nums,i 为当前下标,每个值都判断 temp 中是否存在 target-nums[i]的 key 值

  2. 如果存在则找到了两个值,如果不存在则将当前的 (nums[i],i) 存入 map 中,继续遍历直到找到为止

  • 两数之和[9]

  • 三数之和[10]

4. 股票系列

  • 买卖股票的最佳时机[11]

5. 动态规划

一般只考察一阶动态规划,从结果推起,推导出一个公式。

看到一个段子:如果你遇到一个面试官给你出了个三阶动态规划,你就放弃把,因为面试官很怕你做出来。

  • 爬楼梯[12]

  • 三角形最小路径和[13]

动态规划的题很多很多,可以慢慢悟,等到灵光一闪,你就懂了

6. 位运算

  • 位 1 的个数[14]

目前已拿到头条的 offer,薪资方面也比较满意,不过考虑到个人追求,最终还是选择了阿里。希望一切顺利~~~ 希望这篇文章对你有用~ 点赞转发~

参考文献

  1. 极客时间《数据结构与算法之美》

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 亿个整数排序?如果觉得文章不错,帮忙点个在看呗


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值