UP | HOME

如何在国内互联网大厂面试中游刃有余

目录

你好,我是十一。

相信参加过多次面试的同学应该会发现,面试官的第一个问题一般都是围绕着简历中的项目经历展开,当项目经历聊得差不多了,再开始问一些技术点,考察算法编程能力。在整个过程中,有很多人因为在面试前没有做好准备,导致表现不佳,可能编程环节都没有开始就被刷下去了。

那么,如何做好面试前的准备,让我们在面试中游刃有余呢?接下来我给你分享一下我的经验和方法,包括简历准备、项目准备和算法准备这三方面,希望能给你带来参考价值。

简历准备

首先,我们来看看如何准备简历。一份好的简历可以让面试官更为清晰地认识和了解你,尤其是简历里面的项目介绍,你需要重点准备,突出项目经历的真实性和亮点。具体怎么体现?分享一个小技巧。

在做项目介绍时,切记不要让所有的项目都千篇一律,比如这个项目是做什么的、你怎么做的这样逐一列出。而是应该分清主次,将你认为比较重要且能够体现出你技术能力的项目拿出来重点介绍,比如,对于次要项目,只需要简单写明项目需求、技术实现和项目成果即可;而对于重点项目,你可以将项目介绍得更详细一些,从项目为何要做,需求是什么,到满足这些需求需要什么样的技术,这些技术可以达到什么样的效果,甚至项目过程中是否有技术创新,以及详细的项目解决方案都可以拿来讲讲。

下面我提供了一张项目介绍时的导图,你可以按照这张图,将上面讲述的项目重点分为三个方面进行介绍,这能直接体现出你利用技术解决具体问题的能力。

0aefcc818bc129ba4ae6d8f73ca293be.jpg

我给你举一个重点项目介绍的例子,比如我以前做过一个翻译记忆库 - 机器翻译的项目,写在简历上的部分是:

问题背景:目标公司有很多人工翻译的平行句对,希望可以通过算法来利用这部分语料,针对性提升自己公司产品的文本翻译质量。

需求分析:如何利用公司私有平行句对提升翻译质量,增强模型可迭代性,无需重复部署模型。

涉及技术:Translation Memory,Point-Network(这里需要简单介绍下每个技术点的作用)

项目结果:技术价值,翻译质量提升 x% 以上;业务价值,公司语料应用范围几何级扩增,节省公司生产费用 x% 以上。

从上面的例子中,你可以看到,我首先介绍了项目背景,紧接着明确了需求分析、需要用到的技术,以及最后的成果。这就突出了我对整个项目的把控以及细节的处理。

如果你要描述次要项目,就不用这么详细了,只需要写一下你做了什么,实现了怎样的功能就可以了。

简历的页数有限,按照上面的项目介绍方法,你就可以把主次分开,面试官看起来也会一目了然。另外,关于简历撰写工具,相较于 Word,我更推荐你使用 Latex,它对于格式和图片的组织更为便捷。

项目准备

前面只是简单地介绍了简历中怎么写项目经历,但在面试中,面试官会通过我们对项目的介绍,来判断我们对技术的理解。所以在面试前,我们应该对自己从事的技术领域的知识框架进行详细的梳理,比如自己做过的项目分别属于哪一个子领域,各个项目之间是否存在关联。

值得注意的是,梳理框架需要你对所从事领域有比较全面的了解,自上而下建立起完整的知识体系,过程中也可以借助专业的参考书或综述论文,按照当前自己所从事领域的进展,分类别、分方向进行梳理。

知识框架搭建起来之后,我们就可以在各个看似无关联的项目之间,建立起它们的内在联系。比如机器翻译领域,它的框架就可以这么建立:

eee08568485c081dc2363388b93a7c82.jpg

在梳理完框架之后,我们可以将自己的项目按照项目本身解决的业务问题和用到的技术这两方面进行分类总结。这样,在被问到对应项目时,你就可以详细介绍所涉技术,并由此关联到其它技术,引申出更多细节,展现自己在该领域深厚的技术积累和全面认知。

比如我在面试中,曾被问到翻译记忆库项目。对话如下:

面试官:翻译记忆库是做什么的?这个项目解决的业务问题是什么?

我:对方公司有很多人工翻译的平行句对,但没有高效利用这部分语料的方法,希望我们通过算法来提高利用这部分语料的效率,针对性提升公司产品的文本翻译质量。而翻译记忆库则是重复利用高质量文本的一种算法,可以从“模糊匹配”的角度来提高文本利用率。

面试官:具体的细节可以讲一讲嘛?

我:详细介绍所使用的技术,从记忆库编码模块,到记忆库辅助解码模块,以及解码效率展开细节。并指出其中 rare-words 的复制问题,进而引申出 rare-words 问题为什么会存在,它是开放词表问题引起的,目前的解决方法有哪些。

面试官:这样做完之后,可以完全解决利用效率问题?还是说只能解决一部分?

我:不能完全解决,因为高质量文本是有限的,而需要翻译的文本多种多样。高质量文本只在翻译其相似文本时,才能提高翻译质量。并且由于解码过程的可控性问题,也会存在相似但不能生效的问题。

算法准备

如果你在面试中顺利地和面试官聊完项目经历,来到了技术考察这一关,那么,算法理解和手写代码就成为最核心的考察内容了。所以,面试前的算法准备,我们要重视。我极力推荐《 labuladong 的算法小抄》这本书,里面有不少常见题目类型(动态规划、查找、双指针、高频面试题目)的总结归纳,可以节省你不少时间。

我在做模拟面试题时,按照技术题目的难易以及涉及的知识,将大部分模拟面试题目总结分为 4 类,基础算法、二叉树知识、动态规划和经典算法,如下图所示:

b4c291848ac95c0e0438ec441886062e.jpg

对于算法工程师岗位,这四类题目应该是面试过程中最为常见的,因为这几类题目 code 不会太长,最适合在面试过程中考察算法编程能力。

基础算法往往会在一面中考察,包括各类排序算法及其算法复杂度、链表的常见操作和实现等。例如,针对排序问题,常用排序算法如冒泡排序、插入排序、选择排序、快速排序、归并排序、堆排序等,你可以对此类算法进行归纳,并对比其时间复杂度、空间复杂度、稳定性,通过这样的对比来深入理解各个算法不同点。如果在面试中被问及排序问题,我们就可以进行详细的讲解。这类问题面试官通常只会让你简单口述,因此上面的归纳对比就会显得尤其重要。

二叉树问题通常会在二面、三面中考察。涉及递归和动态规划的一些概念,常见的问题包括二叉树的遍历,判断是否为镜像、对称、平衡、搜索二叉树以及二叉树路径和等等。比如我曾在面试中被问到这样一个问题,“给定一个二叉树,输出该二叉树的深度”。

我的回答是:

  • 首先确定这个题目是要考察二叉树遍历;
  • 再确定二叉树的深度,需要对整棵二叉树进行遍历;
  • 至于在遍历过程中如何保存深度信息,层次遍历可以实现,每多加一层,深度便会加 1。所有层遍历结束,有多少层,深度便是多少。经过上述思考,开始开发层次遍历的代码:

    def maxDepth(self, root):
      if not root:
        return 0
      current_list = [root]
      depth = 0
      while len(current_list):
        tmp_litst = []
        for node in current_list:
          if node.left:
            tmp_litst.append(node.left)
          if node.right:
            tmp_litst.append(node.right)
        current_list = tmp_list
        depth += 1
      return depth
    

对于动态规划问题,也是出现在二面、三面中,解题思路万变不离其宗,就是要找到状态转移方程,这适用于几乎所有的动态规划题目,我建议你以 LeetCode 上“股票”相关的算法题为例找找感觉,培养下如何去找到解题需要的状态转移方程。具体的例子我就不再展开了,你可以按照自己的逻辑去培养状态转移方程的建立方法。

还有一种是经典算法题,我们也需要足够重视,因为这些题目是面试中常考的,比如滑动窗口、双指针、公共子序列和链表反转等。在我所有的面试经历中,共有三次被问到子序列问题,可见频率还是很高的。

举个例子,我记得有位面试官问过我,“给定一个无序整数数组,请你找到其中最长上升子序列的长度”。

我是这么回答的。首先这是个动态规划问题,需要找到各个状态之间的转移方程。这个方程转移过程中,应该需要一个变量保存当前状态的最大上升长度。所以,在状态转移过程中,我要确定其最大递增长度,之后进行程序开发。

class Solution:
  def maxLength(self, nums):
    n = len(nums)
    if n == 0:
      return 0
    dp = [1 for _ in range(n)]
    for i in range(n):
      for j in range(i):
        if nums[i] > nums[j]:
          dp[i] = max(dp[i], dp[j] + 1)
    return max(dp)

可见,在针对动态规划问题时,找到转移方程真的是非常重要了,其它都是一些细节上的处理。

好了,今天聊了这么多,相信你已经掌握了面试前的准备技巧。你还可以根据下面这张思维导图,进行关键知识点的复习:

baa87267df9a19cb1c4612a7352190f1.jpg

最后,我再给你留一道思考题:面试一个工作岗位时,如何结合自己的简历,来体现出你更适合这个岗位。

你可以在评论区留下你的答案,我们一起讨论。

作者: Petrus.Z

Created: 2021-09-01 Wed 00:39