三、练习编程问题

原文:Chapter 3: Practice Coding Questions

译者:飞龙

协议:CC BY-NC-SA 4.0

自豪地采用谷歌翻译

这是我们的“谷歌面试准备系列指南”的第三章。 谈到谷歌面试准备时,大多数人会考虑尽可能多地练习编程问题。

这部分是正确的,因为你当然需要练习。 但是,很少有人做得正确。 用正确的方法,你绝对可以巧妙地练习,并在更短的时间内得到改善。

在这一章中,我将详细解释如何用以前的实用技巧来练习编程问题。 更具体地说,你会更多地了解以下问题:

  • 为什么我们需要练习编程问题
  • 何时练习编程问题
  • 如何巧妙地练习(这篇文章主要是关注这个)
  • 推荐的资源

为什么练习编程问题

我们应该总是问自己为什么需要做一些事情。如果我们没有明确的答案,它不值得花费时间和精力。

编程面试的严峻事实是,所提出的问题与软件工程师的日常工作没有直接关系。你很少在一个实际的项目中实现一个递归算法,最常用的数据结构不是树,栈或队列,它只是数组。

然而,评估一名工程师的最具成本效益的方式仍然是编程问题,因为没有公司能够给每个候选人一个月的实习来评估他/她的技能。

这意味着,除非发明更好的面试形式,否则编程问题仍然是“考试”的主要形式。为了在这个游戏中生存,你必须习惯于那些在实际项目中永远不会遇到的问题。

不要期待再次提出同样的问题(尽管这是可能的),而是熟悉这种类型的问题,也可能对你的工作有所帮助。

什么时候

这是非常重要的,我必须在这里强调多次:在熟悉基本的数据结构/算法之前开始练习编程问题是没有意义的。

你应该检查我们以前的文章,并确保你的基础是扎实的。 第一个错误不是人们练习不够,而是过早开始练习编码问题。 这就像没有扎实的基础,一切都只是废话。

好的,在这篇文章的其余部分,我会专注于如何巧妙地进行练习。

几年前,网上没有任何资源,人们不知道该怎么准备。 现在,你可以找到你练习不到的更多的问题。 这个想法是,你不需要完成你在网上看到的每一个问题,也不需要浏览所有这些在线资源。

80/20 规则说 80% 的结果来自 20% 的原因。 我想帮助你确定你需要关注的 20%。

提示 1:编写健壮的代码

很多人都害怕亲自做一件事。 在练习编程问题时,他们所做的一切就是“用自己的想法”来解决问题。 如果他们提出了理论上的解决方案,他们认为他们已经解决了这个问题。

用我的话来说,正确的做法甚至还没有完成一半。 这是因为我见过这么多的人,即使他们的想法是完全正确的,也没有写下可靠的代码。

最常见的抱怨是“我的执行速度慢”,“我已经有了正确的方法,我只是没有得到正确的代码”,“我的代码只有很少的小错误”等等。 恕我直言,这些都不是微不足道的,如果你还记得一些东西,这不是你可以立即改掉的东西。 实质上,这些人只是没有写足够的代码而已。

统计显示,只有 10% 的程序员可以编写二分搜索而没有错误。 我希望这个数字能让你更加关注代码。

提示 2:把想法说出来

面试与考试不同,因为这是一个互动的过程。 有些候选人喜欢说“给我 10 分钟”,然后一切都沉默了。

相反,强烈建议把想法说出来。 这有很多好处:

  • 展示你的沟通技巧
  • 如果你不在正确的路线上,面试官更有可能纠正你
  • 这可以帮助你更清楚地理解你的想法,并防止你在想法足够具体之前编写代码

但是,这个建议说起来容易,但做起来难。 大多数人习惯安静地思考。 因此,在实践中把想法说出来是很重要的。 事实上,你应该和面试一样做相同的事情。

另一种做法是与 Gaino 的朋友或有经验的面试者进行模拟面试。

提示 3:跟踪你的时间

大多数人喜欢在安全舒适的环境中练习。这是错的!请记住,如果你的实践环境与真实面试过于不同,你很可能会有意想不到的经历。

最常见的抱怨之一是“我没有足够的时间来完成代码”。老实说,我一点也不惊讶。在练习编码问题时,有多少人注意速度?很少。

我的建议很简单。如果你想改进一些东西,跟踪它。当每个人第一次跟踪时间的时候,它们都会对速度有多慢感到惊讶。人类不善于估计时间。

对于谷歌编程面试,每一个正好 45 分钟。你会打个招呼,并在第一个 5 分钟内介绍自己,最后,你可以再花 5 分钟提问。在剩余的 35 分钟内,你需要完成 2 个编程问题,其中至少有一个需要编写代码。

不要忘记,你也将与面试官讨论,所以你可能有更少的时间来编写代码。这在其他公司中是相当标准的。

提示 4:返回到基础知识

不要为了练习编程问题而练习编程问题。你需要弄清楚自己的弱点,并在选择问题时做出明智的选择。不管你多努力,总是会有更多的无法准备的问题。处理正确的问题是成功的关键。

一开始,最好涵盖许多不同类型的问题(例如链表,递归,动态规划等)。不过,以后你应该更专注。

如果你发现自己的弱点是一个特定的领域,例如树问题。通常有两种情况:

  1. 你的基础不够牢固。换句话说,你对基本的数据结构/算法没有清晰的认识。在这种情况下,不管你练习了多少个问题,你的问题总是在那里。你应该做的,是回顾你的教科书,并解决根本问题。
  2. 有时候,你只需要多练习。去寻找更多相同类型的问题,并把重点放在这个领域一段时间。这是一个比漫无目的的更有效的方法。

推荐的资源

你无法练习所有在线问题。 准备正确的资源可以为你节省大量的时间,这就是为什么我认为每个人都应该严格挑选在线资源。

这里有几个我推荐的资源:

  • Gainlo 编程面试问题 - 我们介绍了很多带有详细分析的问题,像谷歌,优步这样的顶尖公司都会询问它们。我认为分析过程比答案更有价值。
  • Leetcode - 我不建议你完成 Leetcode 的所有问题。 然而,它标出了不同层次的问题,用于很好地了解你是什么水平。
  • Glassdoor - 我通常在准备的最后阶段使用这个网站。 假设你将在两周内面试谷歌。 你绝对可以在那里找到最近提出的问题。

我并不认为你真的需要 10 多本书/网站来练习。 但是,对于你解决的每一个问题,你都应该把它当成真正的面试问题。

总结

本章的重点绝对不是让你练习尽可能多的问题。你应该挑选在线资源,并在实践中聪明一些。

清楚自己的实力/弱点并做相应的准备。了解你自己而不是漫无目的地工作,这很重要。

如果我希望从本章中得到一件事情,那就是确定你的 20% 的努力,并尽可能多地关注它。

顺便提一下,如果你想得到资深的面试官的更多指导,可以查看 Gainlo,以便与 Google,Facebook 等公司的工程师进行模拟面试。