国外大厂程序员分享: 30多场面试失败经历总结出来的经验

创作不易,方便的话点点关注,谢谢
文章结尾有最新热度的文章,感兴趣的可以去看看。
本文是经过严格查阅相关权威文献和资料,形成的专业的可靠的内容。全文数据都有据可依,可回溯。特别申明:数据和资料已获得授权。本文内容,不涉及任何偏颇观点,用中立态度客观事实描述事情本身
文章有点长(4300字阅读时长:10分),期望您能坚持看完,并有所收获。
导读
刷了几百道力扣(LeetCode)题,也不能保证你能通过任何一场编程面试。很长一段时间里,我都以为攻克编程面试无非就是尽可能多地刷题。然而,即便我刷了1000多道力扣题,编程面试却还是屡屡失败。
面试的时候,我常常表现糟糕,大脑一片空白,或者犯下在家练习时从没犯过的低级错误。经历了几次面试失败后,我才意识到,在面试中解题和在家刷题完全是两码事。问题其实并不在于我的编程能力,而是我在面试时的心态和应对方法。
今天,我要分享一些改变了我应对编程面试方式的步骤,正是这些步骤帮助我通过了亚马逊、谷歌、微软和Adobe等多家顶尖科技公司的面试。我会谈到心态的转变以及实用的策略,帮助你减少失误、优化解决方案,并显著提高通过面试的几率。
1. 心态
首先,咱们来聊聊心态。 我们在面试时通常很难发挥出最佳水平。被他人观察带来的压力以及有限的时间,使得面试这种情况极具挑战性,这往往会导致我们犯错,哪怕是面对简单的问题也不例外。但只要有正确的心态,你就能更自信地应对这些挑战。以下是几种能帮你更有效地应对编程面试的心态:
1.1 别指望立刻就能想出完美的解决方案
面试本就设计得有难度,面试官并不期望你一开始就能给出完美的解决方案。从分析问题到得出解决方案的这个过程,才是面试官最看重的。先从简单的思路入手,然后逐步迭代优化你的解决方案。
1.2 大声说出思考过程
在面试中,你如何表达沟通往往比得出完美答案更重要。 面试官想要了解你的思考逻辑,比如: 你为什么做出某些选择? 你考虑了哪些权衡因素?
所以,在解题过程中一定要把自己的思考过程说出来,这样能确保你和面试官的思路保持一致。 我经常发现,大声解释自己的思路能帮助我更快地解决问题。
1.3 保持冷静
由于时间紧迫,又有他人在一旁观察,面试往往让人倍感压力。 你越焦虑,就越容易忘记自己已知的知识,匆忙给出解决方案,进而犯下错误。这就是为什么保持冷静沉着的心态如此重要,它能让你思路更清晰,发挥出最佳水平。
不妨抱着和朋友聊天的心态去参加面试,这种视角的简单转变有助于你保持冷静、思路清晰,更自信地去解决问题。
2. 自我介绍
面试开始时,你很可能会被要求做自我介绍。 令人意外的是,很多人都没有为此做准备,结果介绍起来啰啰嗦嗦、没完没了。所以,你要准备一个简短清晰的自我介绍,时长控制在两分钟以内。一个好的自我介绍体现了你对面试官时间的尊重,也能为面试开个好头。
3. 理解问题
做完自我介绍后,面试官会给你出一道编程题。很多应聘者常犯的一个错误就是,没花时间充分理解问题就直接开始解题了。如果不花时间仔细分析问题,你就可能浪费宝贵的时间,甚至最后解错了题。 记住,关键不在于速度,而在于正确性。所以,理解问题永远应该是你的首要任务。花点时间把问题通读一遍,然后再读一遍,仔细留意每个字词,标记出任何特定的细节或限制条件。例如,如果题目提到数组是有序的,你脑海里就应该立刻想到“二分查找!”。
3.1 提出澄清性问题
现在,读完题目并确定关键限制条件后,就该做一件很多应聘者都会忘记的事了——提出澄清性问题。题目中可能有些部分不是特别清晰。 当你提出巧妙且经过思考的问题时,面试官是会欣赏的。
举个例子,假设题目是这样的:“给定一个整数数组,返回相加等于特定目标值的两个数字的索引。” 你可能会问的一些问题包括: 数组中可以有重复数字吗? 是否一定恰好有一个解? 如果没有两个数字相加等于目标值,我该返回什么? 输出结果中索引的顺序重要吗?
通过提出澄清性问题,你能确保自己完全理解面试官的期望,避免做出错误的假设。不要忽略题目陈述中的任何部分,也不要对题目中未明确给出的内容做任何假设,只要做了假设,就要和面试官确认一下。
3.2 输入/输出示例
充分理解问题后,花些时间梳理几个输入和输出的示例,确保自己完全掌握题意。这一点非常重要,因为很多时候,仅仅是梳理输入和输出示例就能揭示出解题思路。
如果涉及到更复杂的数据结构,比如树或图,把示例画出来会很有帮助。这样做能极大地提升你对问题的理解。当你画出输入和输出示例时,常常会发现之前没考虑到的模式或边界情况。
尽量选取涵盖多种场景的示例,例如,如果题目涉及二叉树,那就考虑节点数量不同的各种示例。
思考一下可能出现的边界情况。
4. 规划解决方案
好了,既然已经理解了问题,现在就该开始规划解决方案了。
这正是很多应聘者感到有压力,想直接开始写代码的阶段,但相信我——在没有清晰规划的情况下匆忙写代码是你可能犯的最大错误之一。
4.1 从简单入手
在力扣这类平台上练习时,我们往往一开始就追求最优解。但在编程面试中,可不能这么做。先想出一个简单的方法——哪怕是暴力解法也行。它可能不是最高效的,但能表明你理解了问题。
你可不想让面试官觉得你连简单的解法都想不出来。最初的解法不完美也没关系,重要的是你能解释清楚这个解法,以及它的时间和空间复杂度。
以之前那个需要在数组中找出相加等于目标和的两个数字的例子来说,暴力解法就是检查每一对数字。它的时间复杂度是(O(n²)),但对于小规模输入是可行的。这表明你对问题有足够的理解,能够想出一个可行的解法。
4.2 优化
给出简单解法后,不要就此止步。面试官想看到你如何改进和迭代自己的方法。问问自己:我能让这个解法更快吗? 我是不是在做重复的无用功? 有没有办法利用题目中的限制条件?
在两数之和的例子中,解释完暴力解法后,你可以提议使用哈希表来存储已经看过的值,这样就能把时间复杂度降低到(O(n))。
下面咱们来探讨几种优化解决方案的策略:
📊 利用未使用的信息 不要忽视小细节。如果题目提到数组是有序的,那你就应该想到:“我该如何利用这个信息来优化我的解法呢?”
有序数组或许能让你使用二分查找来替代线性查找,从而显著提高效率。
🔄 逆向分析输入/输出示例 有时候,仔细研究输入和输出示例就能找到问题的解法,对于涉及树或图这类复杂数据结构的问题尤其如此。
先梳理基本示例,然后再挑战更复杂或边界情况的示例。
⏱️ 预先计算信息 如果你发现某些计算会多次重复,那就考虑预先计算数值。
像前缀和或频率计数这类技巧能帮你避免后续的冗余计算。
在编程面试中,当你需要高效查找时,哈希表应该始终是首要考虑的对象。
它能提供常数时间的查找,这对于那些涉及搜索、频率计数或检查重复项的算法来说,能极大地改善时间复杂度。
⏳ 权衡时间和空间 在很多编程问题中,你都会面临在使用额外内存以改善时间复杂度,还是保持低内存使用但牺牲运行速度之间做权衡的情况。
有时候,使用额外的内存(比如哈希表)来加快解决方案的速度是值得的。
💡 数据结构头脑风暴 在脑海中快速梳理一遍可能的数据结构和算法,思考一下每种结构和算法如何能更高效地解决问题。
✅ 保持简单 在编程面试中,应聘者最容易陷入的一个大陷阱就是把解决方案搞得过于复杂。
但事实是:简单的解决方案往往是最好的。
它们不仅更容易理解和解释,而且组成部分更少,犯错的可能性也就更低。
在设计解决方案的每个阶段,都问问自己:“有没有更简单的做法?”
如果要处理复杂问题,把它分解成更小、更易于管理的部分,这样做更容易,也能让面试官看到你的思考方式。
4.3 规划代码
确定最优算法后,不要马上就开始写代码。
如果你对即将要写的内容没有清晰的理解,写代码时就会很吃力,花费的时间会更长,而且更容易犯重大错误。
在心里梳理一遍解决方案,清晰地了解代码的整体结构。
思考一下:
你需要哪些函数或方法? 你将如何构建逻辑? 应该遵循怎样的步骤顺序?
在写代码之前,你要对解决方案的各个部分如何衔接胸有成竹。
如果有帮助的话,可以先把步骤写出来,让思路更清晰。
最后,讨论一下你所采用方法的时间和空间复杂度,并和面试官确认一下,确保他们认可你的做法。
5. 写代码 💻
现在你已经有了最优算法,也清楚自己要写什么了,那就该写代码了。
首先,一定要使用你熟悉的编程语言,除非这份工作明确要求特定的语言,否则就坚持用你最擅长的。
这样你就能把精力集中在解决问题上,而不用操心语法问题了。
写代码时,大声说出你的思考过程,这不仅能让面试官保持关注,还能帮你保持思路清晰。
5.1 保持代码简洁和模块化
使用清晰且有意义的变量名和方法名,让你和面试官都能轻松理解代码。
除非是用作循环计数器,否则要避免使用像(x)、(y)这样的单字符变量名。
相反,要用像currentMax(当前最大值)、sortedArray(已排序数组)或calculateSum(..)(计算总和)这类描述性的名称,让代码更易理解。
在合适的地方,将解决方案分解成函数或方法。
5.2 优先实现核心逻辑
如果时间紧张,那就先集中精力实现解决方案的核心逻辑。
如果时间允许,之后可以再回来添加额外的细节(比如工具方法)。
关键是要展示出你能让解决方案的核心部分运转起来,即便它还不完美。
尽可能简化代码,提高可读性,并确保代码遵循最佳编码实践。
另外,写代码的过程中别忘了解释你所采用方法的时间和空间复杂度,如果可能的话,一步一步地详细解释。
6. 测试你的解决方案
代码写完后,要进行全面测试。
用之前考虑过的示例和边界情况来验证你的解决方案是否符合预期。
手动模拟运行你的代码,也就是逐行梳理代码,模拟不同输入示例下代码的执行情况。
模拟运行能帮你发现一些常见问题,比如差一错误、变量赋值错误或者遗漏边界情况等。
这是一种无需实际运行程序就能调试代码的方法。
确保你的代码能妥善处理边界情况,比如空数组、空值、大规模输入或意外值等情况。
7. 完美收官 🏁
大多数面试结束时,面试官很可能会问:“你有什么问题吗?”
这是你展示对这个岗位和公司真正感兴趣的好机会。
可以问一些经过思考的问题,比如:
团队目前正在开展的最令人兴奋的项目有哪些? 公司是如何开展协作和代码审查的? 团队是如何处理技术债务以及确定优化优先级的?
如果你想了解更多面试中可以问的问题的思路,或者正在准备行为面试,可以查看我的GitHub仓库awesome-behavioral-interviews。
当你结束面试离开时,请记住:编程面试很难,而且并不总是一帆风顺的。有时候,问题异常棘手,或者可能那天你状态不佳。这都没关系,每个人都有状态不好的时候。真正重要的是,你要把每次面试都当作一次学习的经历。面试结束后花点时间反思一下哪些方面做得好,哪些地方还可以改进,以便下次做得更好。通过这种反思,你每次面试都会有所进步。
非常感谢您的阅读。

点个“在看”不失联
最新热门文章推荐:
十亿行数据挑战:CUDA申请出战(从17分钟到17秒)
十亿行数据挑战:JAVA申请出战(从71秒到1.7秒的逐步优化)
十亿行数据挑战:Rust请求出战( 5 分钟到 9 秒的历程)
从北大到小米:罗福莉如何用自然语言处理技术改变国内AI格局,引发国际关注与热议
开发者的福音:10款超棒工具让你的工作效率翻倍,告别加班熬夜的痛苦!
十亿行数据挑战:python申请出战
十亿行数据挑战:go申请出战(从15分到5秒)
十亿行数据挑战:C++如何快速高效地处理海量数据?
印度裔科学家AshishVaswani的Transformer模型为何让中国AI学者刮目相看?
传统爬虫 vs AI爬虫:为什么AI能轻松应对网站结构变化,自动理解并适应不同网页内容?
训练Transformer模型:预测股票价格(教程与代码样本)
国外C++大佬分享:多年编码后发现的 8 个 C++ 性能技巧
从美国到中国:入选AI2000榜单最顶尖学者的Trevor Darrell
参考文献:《I FAILED 30+ Coding Interviews Until I Learned THIS》
到顶部