写在前面的话
很多老读者都知道,我 2018 年年底从携程旅行网离职与人合作创业,项目于 2019 年 8 月正式上线运营,8 月后到 12 月初系统针对之前的一些问题做了第二版的优化和重构。从 12 月初开始工作就不是太忙,于是更新了一下简历,出去面试一下保持自己对技术的敏感度(当然,如果有合适的职位也是可以考虑的)。我求职的职位是资深开发或者系统架构师级别,开发语言优先选 Java,其次是 C/C++。老的读者应该知道,我是 C/C++ 出身,后面由于工作需要开始做 Java,并且专门去携程历练了一段时间自己的 Java 技术。
因为厌倦某些小公司的各种不规范和不公开套路操作以及老板的画饼,所以这次只投递了一些大的互联网公司,先后去了字节跳动、360、腾讯、阿里巴巴、饿了么、哈喽单车等。
高级面试会问哪些东西?
我期望的薪资是年薪八十万左右,当然具体的待遇会综合考虑的,薪资不是主要因素。很多读者可能想知道:这样级别的面试一般会问些什么东西?
这里可以大致的给大家做个简单的总结:
1. 如果是业务相关的公司或者部分会问一些业务细节,比如我做的是互联网金融,那么有关联的职位会问一些业务关联的问题;
2. 对于大多数大的互联网企业至少会有三轮技术面试,一般的面试官的情况分为两种:
第一种情况:前两轮是你将来入职所在部门的两位同事,第三轮是所在部门的主管,这种岗位一般是资深开发或者架构师级别,这样的话,前两轮的面试官是与你将来共事的平级同事,三面是你将来的 leader。
第二种情况:第一轮面试官是你将来的共事的同事,第二轮的面试官是将来所在部门的 leader,第三轮面试官是大部门的 leader 或者 CTO,这种岗位一般是架构师或者开发经理,进去后可能会带团队。
如果一面二面是你将来入职的平级同事,一般会问一些比较常用或者基本的开发原理,例如对于 Java 来说,jdk 的一些东西,jvm 一些东西,多线程的一些东西,这个其实是简单的考察,如果答得不好可能会直接被 pass 掉,因为基础不行,但是如果你答得好,一面二面(第一种情况)或一面(第二种情况)根本 hold 不住你,会在简单的走过过场后让更高级的二面(第二种情况)或三面(第一种情况)直接来面你。
此时的三面(第一种情况)或者二面(第二种情况)会详细的和你聊系统架构方面的,有具体技术细节,也有大的框架组织、开发策略等等。如果你从没真实设计过一个大的框架,自己“杜撰”或者“编造”很容易“惨淡收场”。这里建议想往这方面进步的读者,平常要多站在全局的高度去思考一些架构的设计,理清业务流和信息流,同时多自己造一些基础轮子或者认真的研究一些通用轮子背后详细的原理。对于第一种情形的三面或者第二种情形的二面在聊完技术之后会问一些非技术相关,如你的职业规划、离职原因等等。
同样,第二种情形的三面,一般也不会再问你技术方面的问题,更多的也是业务相关的或者其他一些东西,相对来说,这轮面试只要不犯一些低级错误,还是很好过的。
3. 如第 2 点所说,在第一轮或者第一二轮面试中,除了特定技术相关的,大公司最喜欢问的就是一些算法和数据结构方面的问题。这里列举几个大家可以感受一下:
字节跳动问我的算法题有两道:
算法一:
一个单链表,实现按给定的步长进行对折,举个例子,对于链表 1->2->3->4->5->6->7->n-1->n,如果给定的步长是 2,那么对折后是 1->n->2->n-1->3->n-2。
算法二:
假设一个有一个栈的 sdk,提供了栈的出栈、入栈、和长度方法,请利用栈的数据结构和方法实现一个队列功能。(这个题目其实就是实现队列的出队、入队和长度方法,栈的操作是先进后出的,而队列是先进先出的,如何利用栈的先进后出实现队列的先进先出)。
腾讯的算法题:
算法一:
现在只有一个计算能力为 1 W的机器,如何较快的从 400 W的帖子中找到热度值最高的 100 个帖子,帖子有热度值、发布时间和 ID。
算法二:
两个长度不一样的链表,从某个节点开始有公共节点,如何高效的找到第一个公共的节点。(是不是很眼熟?)
360 的算法题:
一个无序数组,如果找到数组中所有元素值为 v 的元素,要求实现的时间复杂度不能大于 O(N),空间复杂度必须是 O(1)。
阿里的算法题:
对于给定的 x 对左右括号,请设计出一个函数打印出所有的括号组合形式,举个例子,当 x = 2 时,括号形式为 ()(),(()),当 x = 3 时,括号形式为 ((())),()()(), ()(()),(())(),(()())。
(如果读者对上面的某个算法题有疑问,可以在文末留言)。
算法和数据结构是万年不变的基础
这些算法题说不难也不难,说容易也不容易,此话怎讲呢?对于校招学生或者刚毕业没多久的开发人员来说,他们可能会经常为了面试刷一些题目,所以相对来说,就比较容易;但是对于一些高级职位工作有些年头的社会人士来说,可能很多算法或者数据结构已经忘记得差不多了。但是根据前面描述的几轮面试,正所谓“阎王好过,小鬼难缠”。如果你在一轮二轮面试中这些算法题答得不好,可能就没机会通过前几轮面试见到后面的面试官。
BAT 等国内的一线名企,在招聘工程师的过程中,对算法和数据结构都会重点考察是普遍现状。但算法易学难精,我的很多读者技术实力其实不错,但面试时总败在算法这一关,拿不到好 Offer。但说实话,数据结构和算法花点时间,用对方法,很容易解决。
面试官为什么爱问数据结构与算法也容易理解:
所以无论对于学生还是社会人士,要想拿到自己满意的工作,熟悉常见的数据结构和算法还是有必要的。(当然不仅仅是为了面试,也是夯实计算机知识基本功)。对于很多人从上一家公司提离职,到求职面试,准备时间并不一定充裕,所以针对性的刷一些题目还是有必要的。说到刷题,那肯定没人不知道 LeetCode。
很多人 LeetCode上狂刷题,还炫耀自己刷了多少,但这样反而学不到东西。我建议你在刷题的过程中,把问题拆解、解题分析、得出结论、举一反三,每一个环节都要想的清清楚楚,这样才是高效的刷题方式。
推荐一个课程
我认识一个 Google 的资深软件工程师,叫苏勇。这哥们最开始去硅谷面试,因为算法问题,求职的过程非常坎坷。但他铆足了劲,就想进大厂,用了5个月的时间,把力扣( LeetCode)的题,基本刷了个遍,把一些常见题目、巧妙的解法都整理成了一套刷题笔记。靠着这套笔记,这哥们一路逆袭,拿到 Google 的高薪 Offer,让我实属佩服。
他分享了我一套笔记叫《300分钟搞定数据结构与算法》,就是他根据自己的刷题笔记整理而成的。感觉学完之后醍醐灌顶,所以赶紧和大家推荐一下,可以说这是目前市面最值得你学习的数据结构与算法课程。
这个专栏最大的优势就是专注于算法面试场景,(面试是我们谁都无法逃避的问题,不论是求职还是晋升。)
数据结构和算法五花八门,有些你根本不需要花费大量的时间和精力去准备,有些甚至看都不用看。我看中这门课一个比较核心的目的,就是可以有的放矢地准备面试,知道哪些数据结构和算法是常考的,哪些是必须花时间好好准备的。
专栏已经全部更新完毕,不论你是准备面试突击使用,还是先储备知识,留作之后面试都十分合适。