前端如何搞定算法面试?(非广告)

开篇词:为什么要出这个专栏

市面上关于算法学习的书和专栏很多,其中也不乏一些特别优秀的,比如《数据结构与算法之美》,《算法 4》等等。我为什么还要写这么一个专栏呢?主要有以下几个原因:

  • 市面上精准定位前端岗位的算法面试和学习专栏不多

除了算法岗,不同的工程师岗位考察算法面试的范围和难度差异虽然不大(尤其是 Google 这样的大公司),但侧重仍然会有不同。而市面上资料站多是普适性的,不具有针对性。这些资料前端岗位可以看, 后端岗位可以看,算法岗位依然可以看。

以下分析针对的是「非绝对头部互联网公司」,比如 Google,Facebook。对于这些公司。关于头部公司的算法面试难度,方式,题型等,我会在接下来的《头部公司的算法面试》部分进行讨论。

前面提到了不同岗位的侧重点不尽相同的,比如**前端基本不会问 B 树和 B+ 树等,而后端则很可能会被问到。再比如马拉车算法,AC 自动机算法则更多地出现在比赛中,工程师面试的比较少。**由于职业原因, 前端接触树这种数据结构会更多,因此实际面试也会有所侧重。

另外即使同一种题型,不同的岗位难度也会有所差别,从我的经验来看,「前端岗位各大公司考察的难度普遍在力扣题目的简单和中等左右,而后端岗位则基本都是中等,算法岗位则会多一点 hard 题目。」

社招整体感觉对算法的要求比校招低一些

还有就是不同的公司对算法的要求也不一样,一般而言越是竞争激烈的公司,对基础知识,编程能力要求也越高。而算法就可以很好地体现工程师基础知识和编程能力。如果算法面试运用的足够好,则可以对面试者基础知识掌握程度,沟通能力,取舍能力,思维能力等多个维度进行很好的考察。

因此不同岗位算法面试的大纲是不一样的,要想充分利用自己的复习时间,找到一份适合自己的面试大纲就显得非常重要了,我会在「模块三」对这个问题进行更深层次的讨论。

前端算法面试的难度如何?考察的方向是什么?我想这是很多人想知道的,我会在后面的内容进一步对这个问题进行讲解。

  • 以题目为主线,而不是算法思想和背后的原理

市面上的资料多是以题目为主线,串讲一些经典的,常见的题目。讲题目本身是没有问题的, 我本人不排斥这种方法, 好的题目对刷题的性价比是很高的,我也会在模块四结合一些经典的题目来对前面讲的知识进行串讲,这个部分解决的是如何将我提到的算法思想和技巧应用起来 。但是这种方式很容易出现看完之后如果不主动总结消化,就很容易将知识还给老师的情况。因此我认为中讲解重心应该是「算法思想」,培养大家的算法思维。

我的专栏的特色是从算法思想入手,让大家会一类题,挖掘不同题目背后的联系。这还没完,我还会对不同的类别的题目进行对比分析,让你知道类型题目背后的逻辑。这也是为什么我的专栏和市面上大多数的专栏目录不太一样的原因之一。

  • 不够新,实时性不够。

面试的实时性是很高的。可能这几年市场比较饱和,竞争比较激烈,面试难度就会上升,反之会降低,随着公司的发展面试的标准也会变。另外考察的侧重其实也是会变的,比如之前大家考察算法多是排序,手写树,链表等,甚至不少前端对算法的认识就是各种排序算法以及复杂度和稳定性分析。但是最近几年排序考察的比重在不断降低,算法面试考察的方向更多的是类似力扣和牛客的那种题目。具体来说有搜索类,设计类等。

专栏特色

基于以上三个原因,我写下了这个专栏。本专栏有如下特色:

  • 覆盖市面上前端算法面试大部分题型,并提供完整的学习路线。

  • 教你算法思想,不单单只是会了某一道题,而是掌握一类题。

  • 提供算法模板,帮你更快解题更少出错。

  • 提供实用刷题工具和技巧,让你少走弯路,最大化利用自己的时间。

  • 提供面试技巧,在同样的知识的情况下获得更好的面试反馈。

前端算法面试的题型和难度如何?

由于不同的公司,甚至同一家公司不同时间都算法面试的要求都是不一样的,因此我的建议是你可以先去了解一下自己心仪公司的算法面试难度和方向。据我所知, 拼多多,头条,vivo 算法面试的比重会稍微高一点,难度对标力扣的简单和中等题目类型,大部分是原题或者换皮题。而阿里巴巴,有赞问的编程题会更多,比如给你两个版本号,让你判断哪一个是更新的,比如 3.2.1 和 3.3.3,由于 3.3.3 的第二位比 3.2.1 的第二位大,因此 3.3.3 这个版本更新,这个其实在我们日常做工程中是比较实用的一个功能,但是难度不大,考察的是思维严密程度和基础编程能力。

前端算法题的难度实际上并不高,大家不要太担心算法太难学不会。我多次出去面试的经验以及网上的数据都可以说明这一点,甚至一个简单的链表和动态规划都可以让面试官对我留下深刻的映像(公司前端规模都是上百号的)。通过我的经验以及网上的各种面经和题库我还发现,关于前端面试中的算法不仅难度在简单和中等左右,并且中等的题目类型也是搜索和动态规划偏多。这告诉我们前端同学准备算法面试应该在这两个模块投入更多时间。

接下来,结合我个人以及从广大网友的亲身面试经验来看下各大公司对前端算法的考察方向和难度。

我个人面试的公司有阿里,头条,网易等大公司,也有 GrowingIO,e 签宝,曹操专车,大搜车,贝贝集团等互联网独角兽公司。这其中有的公司甚至压根没有算法面试。

我这里列举我出去面试被问到的部分算法题目。

  1. 不借助四则运算实现两数相加

  2. 爬楼梯变种

  3. 链表反转

  4. 链表倒数第 k 个节点(要求 one pass)

  5. 硬币找零

  6. 用 int32 序列化 和 反序列化 IPV4

  7. 质数筛选

可以看出,从题目范围看,基本都是力扣原题。从题目难度来看,基本是简单和中等,实际上除了硬币找零是中等难度,其他都是简单。从题型来看,有两个动态规划(2 和 5),两个双指针(3 和 4),两个位运算(1 和 6)和 一个数学。

私底下不断有朋友和我交流各个公司的面试题。有的是碰到了不会的面试题来问我有没有好的思路。有的则是恰好面试碰到了原题来我这里“还愿”。从广大网友的面试经历上看,前端岗位面试的题目类型“搜索”, “暴力优化” 和“双指针”,题目难度也主要是简单和中等。这和我的面试经历的重合度还是蛮高的。这里的搜索主要是 DFS,BFS,动态规划和回溯。“暴力优化” 指的是 剪枝,滑动窗口,双指针,单调栈。这三种题型基本占据了 70% 以上的比例,这三个题型同样也是本专栏的主要内容。

以网易 2021 校招的题目为例,我们实际地看下算法笔试题目的类型和难度:

第一题:

小易今天读了一篇英文文章,他现在想从里面找出一个单词作为这篇文章的关键词。一个单词可以作为个关键词当且仅当它在这篇文章中出现的频率不低于 1%,现在他想知道有多少个不同的单词可以作为关键词。

这个题目比较简单,只要掌握基础的数据结构即可解决。我们只需要统计每一个单词的出现次数和总的单词数即可,这种做法的时间和空间复杂度为 ,其中 为 文章的字符总数。

图 1

第二题(2020 年也是这个题):

在一次聚会上,教授们被要求写下他们认可哪位教授的研究成果(也可以写自己,且可能出现重复)。已知,如果教授 A 认可 教授 B,且教授 B 认可教授 C,那么可认为 教授 A 认可 教授 C。现在我们想知道有多少对教授是两两相互认可的?

这是一个典型的图的搜索的题目,此问题可以转化为在一个有向图中求强连通分量,然后统计所有强连通分量中去重的边数目。而关于强连通分量的算法主要有 osaraju 算法,Tarjan 算法和 Gabow 算法,这道题可以使用这三种算法的任意一种简化版即可。然而这种题目在前端算法面试中出现的比例相对比较低。

图 2

第三题:

牛牛有一块 2 * n 的空白瓷砖,并且有 1 * 2 和 2 * 3 两种类型的地毯(地毯可以旋转)。现在他想满足以下条件:

- 瓷砖需要被铺满
- 地毯之间没有重叠
- 地毯不能铺出瓷砖外

求一共有多少种铺地毯的方案,由于结果可能很大,因此你需要返回结果取模 10007。

这是一个爬楼梯的变种题。

由于铺 2 * n 的空白瓷砖就相当于:

  1. 先铺

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值