全文共5789字,预计学习时长18分钟

图源:unsplash

作为四大科技巨头之一,谷歌公司面试无疑是对所有软件开发者技术能力的终极检验,没法靠运气或走捷径,只能通过努力的工作和准备。

好消息是,谷歌完全公开他们对于员工的期望。面试者对谷歌的面试流程和公司文化了解越多,就越有机会成功。本文将深入探讨谷歌的编程面试和行为面试,助你成功拿到offer。

1. 谷歌面试概述和常见问题

谷歌面试概述

整个面试过程需要两个月到两个半月。谷歌对软件开发者总共进行5到7次面试。其中包括最初与谷歌招募者的电话面试,接着是与不同谷歌员工进行的4到6次现场面试。所有编程面试题均要在白板、谷歌文档(Google Docs)或者Chromebook上完成。

谷歌一般雇佣T3级别的面试者(T11是最高级别)。T3是具有本科或硕士学位的入门级全职软件工程师,其年薪大约是11.7万美元。谷歌首选以下几种编程语言:Java、C++、CGo和Python。

谷歌面试中可能遇到以下三种编程问题:

·        系统设计问题:旨在评估面试者在考虑伸缩性的情况下进行高级系统设计的能力。

·        编程面试挑战:旨在评估面试者的数据结构和算法知识,这些知识用以优化常规问题的解决方法。

·        一般分析问题:旨在通过数学或基于观点的问题,来评估面试者的思维过程。

谷歌面试有何独特之处?

谷歌的编程面试流程虽与其它大型科技公司相似,但有一些独特之处,是什么呢?

明确的期望。谷歌的面试流程完全透明,因此在准备时无需臆测。以下是谷歌提供的资源:

·        对软件工程和技术角色的期望

·        如何进行谷歌环聊面试

·        谷歌如何招募人才

图源:unsplash

在谷歌文档中编程。在最初的电话面试中,面试者需要在谷歌文档中编程。通过练习才能在该平台上进行熟练编程,而学会这一技能很重要。点击这里阅读如何为技术面试设置谷歌文档。

评分等级。依据四个招聘标准,对每个面试者按1-4分打分,3分是录用的最低门槛。

招聘委员会。谷歌旨在实现无偏见的招聘,因此设立了招聘委员会来对所有候选人进行招聘筛选。

四个招聘标准。在候选人审核过程中,谷歌更重视认知能力、谷歌范儿(Googleyness)、领导能力以及技术技能。

谷歌希望在候选人身上看到什么?

认知能力。总体认知能力是指解决问题的能力、抽象思维、好奇心和学习意愿。谷歌寻求的是那些能对自己、团队和项目进行复杂思考的聪明人。

领导能力。谷歌聘用具有领导力的候选人。对于谷歌来说,领导力是在需要时解决困难问题的能力,同时能加强道德和安全。谷歌也寻求那些善于放手,让他人自我组织,促进开放交流的人。

谷歌范儿。与所有其它组织一样,谷歌具有特定的公司文化,并寻求与其价值观相契合的候选人。谷歌的主要关注点是人;他们在保持道德的同时,关心包容性和人们生活的改善,以小团体和鼓励创新创造、开放交流的休闲环境闻名。

技术技能。谷歌聘用具有极强编程能力的人,并主要基于对概念的理解而非死记硬背来评估技术技能。主要通过以下方面来评估编程技能:

·        算法

·        排序

·        数据结构

·        图表

·        循环

·        面向对象编程

·        大O符号

·        API(应用程序接口)

·        如何测试代码

·        数学运算(如n选k程序)

2. 谷歌面试过程

第1步. 面试前

准备。准备编程面试是一场持久战。笔者建议提前3个月准备。面试者需要做一个准备计划以免偏离轨道。看看由招聘经理制定的为期12周的最权威编程面试准备路线图(https://www.codinginterview.com/interview-roadmap)。请确保使用谷歌首选的语言来准备,如C++、Java、Python、Go或C。

简历撰写技巧:使用指标描述。尝试使用公式:通过Z,实现由Y度量的X。例如,如果简历上写道:“减少了服务器查询响应时间”,应将其改为:“通过重构API,服务器查询响应时间减少了15%。

更新简历。面试者的简历需要在6秒之内吸引谷歌招聘者的注意。简历过于粗制滥造,是有才能的申请者错失面试机会最常见的原因之一。请务必花一些时间更新简历。

如果简历通过筛选,招聘方会安排电话面试,以了解面试者的更多技能与经验。从简历通过到电话面试大约需要一周的时间。

图源:unsplash

第2步. 谷歌员工对应聘者进行预筛选

电话面试将持续45~60分钟,可能在谷歌环聊(Google Hangout)上进行。谷歌员工将使用与数据结构和算法相关的编程问题进行面试。面试者需要在谷歌文档上使用20~30行代码来解决这些问题。

能在工作中交流思维过程至关重要,这是谷歌评估面试者总体认知能力的方式。

面试者可能会遇到开放式编程面试题。进一步提出疑问,阐明问题是展示解决问题能力的好方法。如果面试者提前完成挑战,可以在剩余时间里寻找优化方法并检查错误,一定要考虑到细节问题。

现场面试

面试者通过预筛选后,将进行现场面试。面试者需要与4~6名谷歌员工会面,每人45分钟。

现场面试的主要关注点是编码,尤其是数据结构和算法。面试者需要在谷歌员工提供的白板或谷歌笔记本上编写代码。最好提前询问招聘方,以便进行适当练习。

现场面试还包括行为面试问题,用以评估面试者作为潜在员工的资质。谷歌希望面试者符合公司的价值观,所以也一定要做好行为面试的准备。稍后将继续讨论。

被录用/未被录用

面试官的评分等级为1~4分,3分是录用的最低标准。面试结束后,招聘委员会将根据反馈做出最终决定。该过程需要几周时间,如果很长时间过去还没有回音,可以发送一封提醒邮件。

面试者被录用后就可以准备讨论薪资和就职日期了。因此很有必要温习一下谈判技巧。如果没有被录用,可以在六个月后再次申请,这将为面试者留出充分时间来做准备,并改进弱点。

图源:unsplash

3. 编程面试问题指南

练习编程问题需要付出很多的时间和努力。下面将对最常见的谷歌编程问题进行分析,并提出面试准备的可行建议。

最常见的15个谷歌编程面试问题

1.找到K个最接近的数。

问题陈述:给定一个排好序的数字数组和2个整数——K、X,在数组中找到K个最接近X的数。返回排序后的数字。X不一定出现在数组中。

2.求数据流中第K大的元素。

问题陈述:设计一个类,在数据流中高效地找到第k大的元素。该类需满足以下两个条件:

·        该类的构造函数能接收一个整数数组,包含数据流的初始元素和整数K。

·        该类应该公开一个函数add(int num),该函数将存储给定数字并返回第k大的数字。

3.删除给定键的节点。

问题陈述:给定一个链表表头和一个键。需要删除包含该键的节点。

4.镜像二叉树。

问题陈述:给定一个二叉树的根节点,交换所有节点的左右子节点。

5.找到和的所有路径。

问题陈述:给定一个二叉树和数字S,找到所有从根到叶节点的路径,每一路径的所有节点值等于S。

6.找出最多有K个不同字符的最长子字符串的长度。

问题陈述:给定一个字符串,找出最长子字符串的长度,其中最多有K个不同字符。

7.查找无重复字符的最长子字符串。

问题陈述:给定一个字符串,看其字母能否重排,使任意两个相同的字母不相邻。

8.划分等和子集。

问题陈述:给定一组正数,判断能否将其划分为两个子集,使得两个子集的元素和相等。

9.判断数字是否有效。

问题陈述:给定一个输入字符串,判断它是否为有效数字。简单起见,假设输入中不存在空白字符。

10.复制具有任意指针的链表

问题陈述:给定一个链表,该节点有2个指针。第一个是常规的next指针。第二个为arbitrary_pointer(任意指针),可以指向链表的任一节点。

面试者需要编写代码,实现对给定链表的深度拷贝。这里的“深度拷贝”指对原始链表的任何操作(插入、修改和移除)都不会影响拷贝的链表。

11.输出平衡大括号组合。

问题陈述:给定值N,输出N组大括号的所有组合,以使其平衡。

12.给定多个任务,判断能否安排所有任务。

问题陈述:有N个任务,从0标记到(N-1)。每个任务都有一些需要在安排之前完成的先决任务。给定任务数量和先决任务的列表对,判断能否安排所有任务。

13.实现LRU缓存

问题陈述:最近最少使用(Least Recently Used,LRU)是一种常见的缓存策略。它定义了从缓存中驱逐元素的策略,以便在缓存满时为新元素腾出空间,这就意味着需要首先删除最近最少使用的数据。

14.找到最大值和最小值的相应下标

问题陈述:给定一个排序的整型数组,返回给定键的最大和最小数组下标。如果找不到,返回-1。数组长度可达数百万,且存在许多重复项。

15.合并重叠的时间间隔

问题陈述:给定一个区间数组(列表)作为输入,每个区间都有开始和结束时间戳。输入数组按开始时间戳排序。要求合并重叠的时间间隔,并返回输出数组(列表)。

图源:unsplash

12周准备路线图

准备谷歌编程面试是有技巧的。它需要数月的准备和练习,以掌握正确的概念,培养自信心。下面这份权威的12周准备计划,已成功帮助许多人在大公司找到工作。

第0周。基于谷歌的期望和自己的偏好,选择一门编程语言。

第1周。复习所选编程语言的基础知识,这样会大大减少在面试中犯错的几率。回顾一些概念,如怎样从控制台读取输入、声明以及使用二维数组。

第2&3周。熟悉数据结构和算法。这对于谷歌的编程面试至关重要。

面试者应该知道的数据结构:数组、链表、堆栈、队列、树、图表、堆排序、散列集、哈希映射/哈希表。

面试者应该知道的算法:广度优先搜索、深度优先搜索、二分查找、快速排序、归并排序、A*算法、动态规划、分治法。

第4&5周。在Educative或Leetcode网站上练习数据结构和算法挑战。先从简单的编程问题入手,由浅入深,逐渐增加难度。

第6~8周。练习复杂的编程问题并计时。考虑每种解决方法的运行时间和空间复杂度。

第9&10周。学习系统设计面试问题。这是面试过程中不可或缺的一部分,会影响面试者的招聘水平。

第11周。学习操作系统(OS)和并发概念。这些问题用于评估面试者的招聘水平。复习多线程原理,以在谷歌的面试梯队中名列前茅。

第12周。学习面向对象编程和设计方面的问题。这些问题能评估面试者的批判性思维和基于项目的问题解决能力。

图源:unsplash

练习编程面试题的小技巧

练习编程没有捷径。以下是指导面试者做好准备阶段的一些基本技巧。

注意时间。编程面试会限时,因此请务必注意时间。如果面试者习惯了在有限时间内进行准备,那么实际面试中的压力会小得多。

了解常见陷阱。谷歌面试常见的三大陷阱:不知道算法的大O符号的复杂性,不了解谷歌的期望,不能清楚表达问题的解决过程。一定要记住这三大陷阱。

清楚地表达过程。谷歌想了解面试者的思维过程。在练习时要习惯于解释自己为什么这样做以及正在做什么。那些对自己工作方式有着清晰认识的人总会脱颖而出。

知道自身弱点。每个人都有弱点,在准备时要注意自己的弱点。谷歌已经声明,其关注面试者的思维过程,因此,如果遇到弱点,就说出来,以表明自己渴望提高的决心。

4. 行为面试问题指南

软件开发候选人常常会忽视行为面试。但事实上,这可能是决定面试者能否成功的关键一役。谷歌非常注重其价值观,所以如果面试者对于这些问题毫无准备,面试官很容易发觉。文化和行为面试可以淘汰那些技能过关但价值观不契合的面试者。

谷歌行为面试一般问什么?

谷歌的行为面试旨在测试面试者在与就业相关的积极/消极情形或冲突中的表现。行为面试帮助面试官判断面试者是否是他们愿意与之共事的人。这些面试会要求面试者对过去的行为或表现做出反思,以测试其在压力下的表现和对专业精神的理解。问题可能有:

·        过去的经历

·        假设的情况

·        价值观

图源:unsplash

如何准备行为面试?

谷歌已经列出了准备行为面试问题的八个步骤。了解这些步骤,用它们来做准备,形成自己的答案。

·        预测未来。面试者可以准备一些可能被问到的问题。

·        练习。谷歌鼓励面试者大声练习,以构建更清晰的答案。

·        计划。写下答案,进行有策略的练习。不要忽略行为问题。

·        阐明。面试者可以使用开放性问题来表现自己作为候选人的价值。

·        数据驱动。谷歌期望看到与有形的增长、变化或技能示范直接相关的答案。

·        制定备选计划。谷歌建议每个问题准备三个答案。这能帮助面试者准备各种有趣的答案。

·        解释。谷歌要求面试者解释其思维过程和决策制定。明确阐述假设和过程能帮助面试者脱颖而出。

·        提高。谷歌鼓励面试者始终专注于自我提高。面试者可以先从粗糙的答案开始,然后努力改进。

图源:unsplash

10个常见的行为面试问题

谷歌编制了其面试官常用的行为面试问题清单,来看一下:

·        描述你的工作历程。虽然该问题没有错误答案,但它可以评估面试者的经历会对其作为开发者的生活产生的影响。一个好的答案应该深入到自己的工作流程、工具和团队合作能力之中。

·        关于自己,你还有什么想介绍的吗?一个好的答案应该显示面试者所具备的可能对谷歌有益的额外技能。面试官还会寻找软技能,看看面试者是否具备有益于团队的非技术经验。

·        讲述你遇到危机和失败的经历。该问题旨在了解面试者是如何学习和面对困难的。一个好的答案应表明面对失败时的诚实和学习的积极性。

·        你最自豪的成就是什么?该问题旨在建立多元化的团队。就长远来看,谷歌借此寻找面试者的专长、成就感和价值观。一个好的答案应该超过现有成绩,并能触及自己作为人的意义。

·        你的加入能对团队产生什么影响?该问题用于考察面试者在集体中与他人合作的能力。一个好的答案应该表明面试者对谷歌价值观进行了仔细研究。最佳答案应与谷歌的目标相吻合。

·        谈谈你工作过的非结构化环境。该问题通过面试者对非结构化的定义来评估其工作风格。一个好的答案应该将工作风格与工作岗位联系起来。面试者能否适应一个预定义的结构呢?

·        你最喜欢的谷歌工具是什么?你会怎样改进它?该问题用于评估面试者对谷歌的了解、面试者的创造性和创新意愿。一个好的答案应该基于数据但不过于技术化;确保专注于想要改变的原因。请记住:这种改变应使人们的生活更便利。

·        你所了解的最复杂的事是什么?该问题用于评估面试者的技能、沟通技巧以及向他人解释复杂性的能力。一个好的答案应该更专注于传达方式的有效性,而非信息本身。

·        谷歌范儿(being Googley)对你而言意味着什么?该问题是展示面试者文化适应性与价值观的好机会。一个好的答案应避免使用太多术语,但能说明谷歌文化的潜在价值。

·        你害怕什么?该问题能看出面试者的弱点和压力源。一个好的答案应该是自我反思的,其目的并不是简单地克服恐惧,而是要了解它们如何影响面试者的。

现在你应该已经了解了谷歌面试的过程、谷歌与其它公司面试的差异,以及如何准备谷歌面试。祝你面试顺利!

推荐阅读专题

留言点赞发个朋友圈

我们一起分享AI学习与发展的干货

编译组:贺宇、陈枫

相关链接:

https://medium.com/better-programming/cracking-the-google-coding-interview-3b8dd29b0d6a

如转载,请后台留言,遵守转载规范

推荐文章阅读

ACL2018论文集50篇解读

EMNLP2017论文集28篇论文解读

2018年AI三大顶会中国学术成果全链接

ACL2017论文集:34篇解读干货全在这里

10篇AAAI2017经典论文回顾

长按识别二维码可添加关注

读芯君爱你

软件开发者的终极梦想:揭秘谷歌编程面试相关推荐

  1. 揭秘APP软件开发者百万富翁之路:造程序的工厂

    2009-12-10 16:48 |  5794次阅读 |  来源:第一财经周刊  [已有30条评论]发表评论 关键词:新闻资讯  | 感谢carlkxiafhwfhw的提供 |  收藏这篇新闻 他们 ...

  2. 揭秘APP软件开发者百万富翁之路:造程序的工厂(好东西)

    他们在等待App Store这样的一个大展拳脚的机会,为此他们可以倾其所有,这也是一个自我传奇的开始. 几乎每个工作日的晚上6点半以后, 在北京望京科技园,几个年轻人从不同的大楼走出来后,都会聚集在一 ...

  3. 揭秘APP软件开发者——百万富翁之路(转)

    他们在等待App Store这样的一个大展拳脚的机会,为此他们可以倾其所有,这也是一个自我传奇的开始. 几乎每个工作日的晚上6点半以后, 在北京望京科技园,几个年轻人从不同的大楼走出来后,都会聚集在一 ...

  4. 这个应用魔方厉害了,让软件开发者效率提升10倍

    摘要:软件开发效率大幅提升一直是开发者追逐的梦想,如何实现梦想?低代码平台将如何展现魅力? 软件开发向来复杂,而且随着业务变化加速,层出不穷的新技术出现,很多软件开发者一直深陷泥潭,处于奔命.996疯 ...

  5. CUDA 10.1 发布;第 15 届谷歌编程夏令营导师机构公布

    (给技术最前线加星标,每天看技术热点) 转自:开源中国.solidot.cnBeta.腾讯科技.快科技等 [技术资讯] 0.CUDA 10.1 发布,NVIDIA 推出的并行计算架构 CUDA 10. ...

  6. 软件开发者的“比天之翼”

     "在天愿做比翼鸟,在地愿为连理枝".关于爱情的这句古今绝唱,如果能够有一天用来形容开发者和营运商之间的关系,我想大概是很多人的愿望. 飞翔一定要有翅膀,就象航海一定要有风帆.对于 ...

  7. 软件开发者的最佳实践

    近期在一个站点上看到一篇写关于软件开发者应该有的几项实践,感觉写的很的好.以下将列举下文章中提到的几个方面. 首先文章中提出,软件开发者须要不断的练习,什么是练习,为什么要练习,练习意味着什么?文章中 ...

  8. 软件开发者升职加薪的 8 项技能

    私下里,经常有一些读者问我:"作为一名软件开发者,我应该掌握哪些技能,才能被领导赏识给我呢?"说实话,我心目中很多选项,不少于 20 个,但我斟酌再三,只挑选了其中最能让你受益的 ...

  9. 改变软件开发者的形象,增加多样性

    Birgitta Böckeler认为,我们必须放弃一次又一次招聘非常类似于我们自己的人才,以实现软件产业更高水平的多样性.她说,事情已经在慢慢地发生变化,各个组织越来越注重于多样性和包容性.有许多能 ...

  10. 软件开发者如何准备未来?

    摘要:现今,科技领域技术更新非常迅速,作为该领域幕后勤恳劳作的软件开发者要想在其中永远保持领先,跟得上时代,就需要时刻面向未来做好准备.但面对各种技术各种开发语言,软件开发者该如何做? 软件开发领域有 ...

最新文章

  1. 投影与三维视觉——本征矩阵和基础矩阵
  2. 大数据互联网架构阶段 QuartZ定时任务+RabbitMQ消息队列
  3. Echarts 自定义数据视图
  4. ffmpeg-0.6.3 移植到 windows 开源代码
  5. UVA12542 LA6149 Prime Substring【筛选法+贪心】
  6. 8086 MOV 指令的注意事项
  7. APISpace 尾号限行API接口 免费好用
  8. matlab单枝节匹配器,第八讲微带匹配电路单枝节匹配电路.ppt
  9. 《美国工厂》:一座中国工厂在数万英里之外的异域镜像
  10. python粒子特效_初试PyOpenGL四 (Python+OpenGL)GPU粒子系统与基本碰撞
  11. 张冬:OpenPOWER CAPI为什么这么快?(一)
  12. 使用SSH方式实现Git远程连接GitHub
  13. BZOJ-2743 [HEOI2012]采花 【树状数组+离线处理】
  14. 三年游戏测试经历之谈 全面且要有专长
  15. 20150114-小白兔去钓鱼
  16. 《机电传动控制》第四周仿真作业
  17. 怎样增加混凝土粘聚性_混凝土配合比粘聚性调整技巧
  18. React学习笔记一(React入门+JSX+脚手架)
  19. RK3588 AP6398RS3之 BT 调试(二)
  20. python keyboard模块使用笔记

热门文章

  1. aws修改服务器端口,AWS Linux修改SSH默认端口失败的原因与解决方法
  2. 织梦图集php,采集功能的使用方法 --- 图片集(一)
  3. python 自动登录网站_Python使用selenium实现网页用户名 密码 验证码自动登录功能...
  4. 知识图谱中三元组抽取
  5. Android源码分析-dex2oat
  6. 使用randn实现randm的通用方法
  7. ESP32-CAM与Tonny搭建问题。
  8. Mac系统程序已卸载,图标还在“启动台launchpad”中,如何清理干净?
  9. Fragment isAdded() returns false on an already added Fragment
  10. 微信id修改服务器繁忙,微信终于可以修改ID了! 但,你可能不行......