查看原文
其他

叮咚,请查收你的圣诞大礼包 | 谷歌技术类实习面试最强攻略

Google谷歌校招 Google招聘包打听 2022-06-16

点击蓝字关注我们

Merry Christmas

你们的小编又来喽!

2020 谷歌技术类实习项目,北鼻们申请了吗?

没有申请的,要抓紧喽!


还不了解谷歌技术类实习项目

没关系,我们来复习一遍!


什么?你是谷歌实习项目资深玩家?

那请直接阅读实习面试大礼包



技术类实习项目

Merry Christmas


软件工程实习项目

Software Engineering Intern 2020 - Beijing or Shanghai


- 学历要求:

2021 年应届毕业本硕博学生(大三,研二以及2021年毕业的博士生)

- 实习时间:

2020 年 7-10 月期间,连续 13 周全职实习

- 申请截止:

招满即止,尽早申请(2020 年 4 月 1 日截止)

- 申请方式:

官网申请,需稳定的网络环境,扫描下方二维码或点击文末阅读原文

https://careers.google.com/jobs/results/98081896488936134/


STEP实习项目(原 EP 实习项目)

Student Training in Engineering Program Intern 2020 - Beijing or Shanghai


- 学历要求:

包括女性在内的少数群体,本科二年级(2022 年毕业)

- 实习时间:

2020 年 7-10 月期间,连续 12 周全职实习

- 申请截止:

招满即止,尽早申请(2020 年 4 月 1 日截止)

- 申请方式:

官网申请,需稳定的网络环境,扫描下方二维码或点击文末阅读原文

https://careers.google.com/jobs/results/88036758257574598/


更多职位相关信息请参考:

2020谷歌技术类实习网申开启 | 你有一个被 Pick 的机会


技术类实习面试最强攻略

Merry Christmas


谷歌技术面试,是每一位申请技术类实习项目的同学都需要进行的。


在面试中,我们不仅仅会衡量同学们的题目完成度,也注重同学们在解决问题的过程中寻求最优解的过程,以及在此过程中与面试官的沟通交流情况。


Q

2020谷歌技术类实习面试一共多少轮呢?

一共两轮,均为电话面试,每轮面试 45 分钟。

请同学们在投递后定期查看申请所用的邮箱,收件箱和垃圾邮件都要查看,所有招聘流程都会通过邮件与你进行沟通哦!

Q

面试包含哪些内容呢?

内容包含简历经历、编程、算法、数据结构。

Q

是否可以内推呢?

可以的,除了网申之外,Googler 内推也是有效的申请方式之一。

Q

已经收到面试邀请,我要如何准备呢?

 练习编程能力  

Merry Christmas

Yuan Li,         

谷歌资深软件工程师


准备面试,绕不开的是刷题。我的方案是,制定每日规划。我在自己刷题的时候,会制定每日刷题目标。某刷题平台中,easy 每题 1 分,medium 每题 3 分,hard 每题 5 分。刚开始刷题的时候,每日目标 20 分;之后加量至每日目标 30 分。

 

高效团队合作:

1. 同水平之间讨论

针对每题,套用以下模板:“针对某刷题平台中的XXX(题号),核心算法是(dp),递推公式是,最终时间复杂度是XXX,空间复杂度是XXX。“如果有不同,再详细讨论分析。


2. 合理设置讨论时间

设置在每天刷题结束后,控制在半个小时内。

 

更多经验:

1. 按题目类型集中刷题

在刷题初期,建议根据题目类型、解题方法等分类,集中刷题。在起初无从下手的一个 hard 题,刷完同类型的各种题目之后,很可能会灵光乍现。在有一定积累(300)之后。可以进入下一阶段。


2. 乱序刷题

不再根据题目类型进行刷题,进行随机刷题。为每道题设立 45 分钟的时间,超时等于失败。


3. 阶段性模拟面试

如果认识 Googler 的话,可以进行模拟面试,考验自己在时间压力下的思考能力、思维逻辑的表达能力、描述能力。

Merry Christmas

知乎用户公子乔安,

2019 SWE Intern

(软件工程实习生)


刷题绝对是准备面试最直接最有效的方式,除此之外从我自己的刷题体验来看,刷题对写业务代码也是有直接帮助的,我自己的体验是在某刷题平台上从 0 刷到 350 题,每多 100 题自己的 coding 能力就会有一个明显的变化,逻辑和 coding style 上都会有不一样的认识,所以刷题的作用也不仅仅是准备面试。回到准备面试的话题,我自己在准备面试之前把前 300 题刷了 3 遍,有些很经典的题可能更多,刷题的大致思路如下:


1. 先了解面试算法的范围和题型

如果是第一遍刷某刷题平台,建议先了解每种算法对应的题型,因为我自己修过算法课,所以这一步我就略过了。没有基础的同学可以去看看算法和数据结构的书,再结合网上的一些视频和面经,甚至就看某刷题平台的 tag 都行,对应的每个 tag 刷 10 道左右的题。


这个阶段刷题的目的有两个:

1)明白这个类型的题长什么样(比如什么样的题是动态规划,什么样的题是搜索题)。

2)有慧根的同学可以总结出根据题面想对应算法的套路,没有慧根的同学可以看别人总结的。


这个阶段建议以思路为主,多看看网上大神们对题目的解读,以动态规划为例:为什么这道题该用动态规划?我一开始的想法和动规比差距在哪?


这个阶段其实是比较痛苦的,我自己在这个阶段基本是全靠看,照着思路写,然后好不容易调 ac 了再慢慢思考一下题目哪些地方暗示了该用这个算法,想通了就想通了,想不通就先放放希望以后能想通(当刷题量上来了时候真的能想通了,相信我!所以大家一定要坚持坚持坚持,然后继续下一题。


2. 按顺序刷第一遍,注意复杂度分析

这一步就正式开始刷题了,从某刷题平台第一道开始,刷就完事了?当然不,看到一道题,我一般先根据题面思考这道题有没有考到什么算法,什么数据结构,然后看看大神们的参考答案,比较自己想的和参考答案的区别,这一步是帮助养成刷题思维,也是对前一阶段的巩固,刷题过程中还是要不断思考总结每个类型的题有什么特点。然后从众多参考答案中确定一种最大众化,较优的解答,作为这道题暂时的参考答案,记下来。注意不要追求很难很小众最优解,因为作为一个小白就算你强行去理解了很 fancy 的思路,你能在面试过程中复刻出来么?刷题的目的不是追求最优解,而是追求可复制性强且面试官能够接受的解答,这样的答案你才能举一反三,才能 hold 住并且用它来解决新问题。所以建议大家去挑大众化的并且复杂度较优的算法,这样的解答一般难度不大并且适配性强。当然这只是暂时的参考答案,后面对算法掌握扎实了完全可以挑选比较 fancy 的算法挑战了。记下思路之后就要对他的时间和空间复杂度进行分析,面试中,面试官也会在写代码前后问你算法的复杂度多少。想好了,就可以开始按照思路写了,写完就是调到 ac,然后下一题。


这个阶段不太建议追求闷头苦想,我自己基本是每道题都会看解答,很少有完全自己想出来的答案。也不要追求刷题效率,菜鸡表示刷题一天ac 4-5 道题太正常了~但是一定要总结思考总结题目类型,多分析复杂度。


3. 反复刷题,掌握基本的算法单元,面向面试

对于刷题,反复刷优先于追求数量,其实某刷题平台前 400 道题足以 cover 常规算法面试的 90% 了(我指的是算法知识点,不是说题目本身),所以如果已经刷到 300-400 的数量级,可以先停下前进的脚步,回过头去看看自己刷过的题是否掌握了,如果没有,就要靠大量的重复来强化。可以参考了知乎上某个帖子里说的标准:


一道题要像写文档一样可以无脑的在白板/白纸/文档上写出来,并且做到 bug free才叫做你掌握这道题了。


刷题的时候可以以这个标准来衡量自己是否需要再刷一遍某道题,尤其是一些比较裸的题,比如一些 dfs 题的答案本身就能作为模板,更要做到无脑写出来。强烈建议大家在做题的时候整理哪些题可以作为模板(例如快排,拓扑排序,多维动态规划,merge interval,双指针等),然后反复把这些代码单元写熟,这样做的好处就是在面试中,你只要集中精力在把面试官给的题目拆解成很裸的算法单元就行了,因为接下来的事情只是把你在脑海中写的代码再敲一遍就完事了。而且你能够百分百确定你敲的代码是对的,这对提升面试信心和效率都很有帮助。


举个例子,比如一道题,如果你能够通过和面试官的讨论把他转化为拓扑排序,而你心中已经有 100% 能够ac的拓扑排序模板,那事情就会简单很多,是不是瞬间就不慌了?当然不是让大家搞个小抄开始背模板,所谓模板其实是反复刷题过程中不断踩坑的经验总结,写的多了,你自然会记得哪里用 i+=1 会越界,会出 bug,下回再写的时候就会规避,久而久之就形成了自己的代码套路。


这个阶段大家刷题的目标就是面向面试刷题了,目标就是能够高效 +bug free 的写出代码(注意白板写啊,请抛弃你的 ide),有位大神曾经给了一个小技巧——计时刷题,自己试过还不错,具体的操作就是保证 easy 题目5min 内写完,medium 题 10-15min,hard 题 15-20min,写完都要直接ac。这也可以作为刷题过程中自测的标准吧,当然计时刷题最大的好处就是让自己注意力集中,练习效率会高很多。


4. 注意 coding style,把每道题说给自己听

如果对于刷题已经能够熟练 handle 了,那接下来要注意的就是 coding style,比如该空格空格,该换变量名换变量名。这一块主要是平时训练有意识就行。


还有就是要学着把每道题说给自己听。有些题你可能写多了就会觉得理所当然了,但是中间可能有很多东西你其实并不知道为什么会这样,只是写多了就机械性的记住了。比如一些比较难得动态规划,必须在推导状态转移方程的过程中多问问自己为什么,才能保证自己是真的懂了,而不是写多了记住了而已。所以假装对面坐着面试官,把答案讲解出来是很有效的训练法,在准备面试之前大家可以通过这个方法来练习。


熟悉在白板/白纸/文档上编程

Merry Christmas

知乎用户胡津铭,

2019 SWE Intern

(软件工程实习生)


面试的编程部分往往是 Google Doc或白板上编程:面试官要么要求在一个类似于 Google Doc 的地方写代码,要么就是干脆在白纸上写代码。这种情况下编程的体验与平时使用 IDE的体验是完全不同的。以 Google Doc 为例,许多人(比如我)一开始甚至很难写出能编译的代码,更别说一遍写出 bug-free 的代码了。同时,没了 IDE,debug 的难度也会大大增加。而在白纸上写代码的难度则还要更进一步。适应白板编程的方法也很简单,只需要足量的练习即可。


Q

把题目做出来就稳了吗?除了写代码,还需要练习什么?

Merry Christmas

Yuan Li,         

谷歌资深软件工程师


不一定的,以下的种种,可能是导致同学们努力做出来题目,却仍然挂掉面试的原因:

1. 题目理解错误

2. edge case

3. corner case

4. 没有达到面试官期待的复杂度

5. 思路表达不够清晰

6. 其他

 

为了避免这样的发生,顺利通过面试,我们首先要了解在一轮面试过程中,面试官会从哪些方面考察我们。众所周知,面试官在面完我们之后,会写一个 feedback。Feedback 除了“应试者把题目做出来了”或“应试者没做出来”以外,还会写什么呢?

 

面试者沟通交流的能力。

 

要知道,面试并不只是为了考察你在不能查资料的情况下做题。除了考察能否做出题目,更重要的是能否合作解决问题。

 

面试实际上是在模拟工作过程中,拿到一个问题之后,如何解决的整个流程。这和写作业是很像的。回顾在学校写作业的时候,你都经历了哪些步骤?拿到作业题目-->(抱大腿-->结束)弄清题目-->理解算法-->编码-->debug-->完成一版-->跑测试发现有写过不了-->脱发-->debug-->......-->结束。

 

那么面试过程中,如何表现呢?

1. 听题+记录

2. 复述+追问

3. 设计输入输出

4. 思路解释,向面试官求证

5. 复杂度分析

6. 设计边界条件

7. 编码

8. 运行测试用例

9. 期待 follow up

 

1. 听题+记录

面试官在描述题目的时候,会描述一个场景。我们在听题的时候,要把题目抽象转化为若干项 RI(Requirement Item),并记录在小本本上。

 

2. 复述+追问

拿到题目后,很多情况下,我们的理解和面试官的表达是有出入的。可能是面试官忘说了某句,我们漏听了,甚至是面试官为了考验我们故意隐瞒了其中条件。应试者需要自己去挖掘这所有的隐藏 RI,把题目搞清楚。还要强调的是,有两个特殊的 RI:时间复杂度+空间复杂度。

 

3. 设计输入输出,思路解释,向面试官求证

截止目前,假如我们已经成功地搞懂了题目,那么我们的小本本上会有好多需求项目。接下来,就需要我们把这些文科生也能听懂的话,抽象成一个函数。具体而言,是抽象成一个函数的输入+输入+好听的函数名称。

 

4. 思路解释,向面试官求证

在我看来,这是比编码更重要的步骤。简单来说,这步主要是在向面试官描述你的想法、思考过程。

“既然输入是一个已排序的列表,那么我可以尝试运用二分查找的思想”。

“我发现在贪心求值的过程中,有重复计算的情况,那是不是可以利用空间换时间,利用 dp 的思想,把之前运算的结果记录下来”。

“我首先做了一次排序,之后两个嵌套循环,最终时间复杂度是 O(N^2),其中 N 是输入元素的个数”。

 

5. 复杂度分析

之前在思路解释的时候,已经分析过时间、空间复杂度了。在此处再次分析,主要做的是在写好的代码中,标注出各个函数的复杂度、循环嵌套情况。

 

6. 设计边界条件

最没技术含量的一个考察点。

给定的输入,在极端情况下,程序该怎么办?

输入是 int,如果是 Integer.max 怎么办?

输入是 String,如果是 null or 空白怎么办?

输入是数组.........

 

7. 编码

硬实力,请去刷题。

 

8. 运行测试用例

在编码完成之后,主动跑一些 case,检验程序的正确,设计 case 也是考察的点。

 

9. 算法分析

分析整个代码,当前代码有哪些不好?结合使用的语言哪些可以优化?如果把输入改成更一般的情况,程序应该如何调整?

 

10. 思路讲解

把思考过程清楚明白地表达出来。

 

总结而言,面试是一个展示自己作为合作者的过程。除了算法本身,如何沟通,把题目弄清楚,完成面试官对你的各方面预期是极其重要的。

更多面试经验分享,

请关注官方知乎账号:

Google 谷歌中国校园招聘

搜索热门问答:

如何通过谷歌技术类实习/校招面试?

https://www.zhihu.com/question/360446321/answers/updated

点击“阅读原文”立即申请!


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存