最近,一道谷歌面试题火了。这是TechLead在谷歌100多次面试中提到的问题,这引起了本文作者Kevin Ghadyani的极大兴趣,并讨论了解决该问题的所有传统方法。

  为了更了解其他人对软件工程的看法,我开始疯狂在 YouTube 上追 TechLead 的视频。在接下来的几天里,我为他在 Google 工作时提出的一道面试题想出了各种解决方案。

  通过 TechLead 模拟 Google 面试(软件工程师职位)

  TechLead 在 Google 的 100 多次面试中都提出了一个问题,这引起了我对 RxJS 的兴趣。本文会讨论解决该问题的所有传统方法。

  他问这个问题的真正目的是从应聘者得到下列信息:在编码之前,他们会问正确的问题吗?提出的解决方案是否符合项目指南?他甚至指出,是否得到正确的答案一点都不重要,重要的是应聘者的思考方式,以及应聘者是否能够理解这个问题。

  他谈到了一些解决方案,包括递归方法(受堆栈大小限制)和迭代方法(受内存大小限制)。本文将对这两个解决方案进行详细讨论。

  TechLead 的问题

  在 TechLead 的问题中,他要求应聘者在如下网格中,计算出所有颜色相同的最大连续块的数量。

  当看到这个问题时,我的第一反应是,必须做一些 2D 图像建模才能解决这个问题。听起来这道题在面试中几乎不可能回答出来。

  但在听完他的详细解释之后,我方知情况并非如此。在这个问题中,我们需要处理的是已经捕获的数据,而不是解析图像。

  数据建模

  在编写任何代码之前都需要定义数据模型。对于任何问题,首先要弄清楚我们在处理什么,并收集业务需求。

  在我们案例中,TechLead 为我们定义了许多具体的需求,例如:

  彩色方块或“节点”的概念

  数据集中包含 1 万个节点

  节点被组织成行和列,即二维数据

  列数和行数可能不同

  节点有颜色信息,并具有对“邻接”这一概念的表示方式

  我们还可以从数据中获得更多信息:

  节点不会重叠

  节点不会和其自身邻接

  节点不会有重复的邻接

  位于边角的节点会比其他节点少一个或两个邻接

  还有一些未知信息,例如:

  行数与列数的比

  可能的颜色数量

  只有一种颜色的可能性

  颜色的大致分布

  开发人员的水平越高,其需要问的问题越多。虽然这有所帮助,但如果不能找出未知信息,问题的实际解决还是会存在阻碍。

  大部分人并不会想到询问这些未知信息。在开始研究这个算法之前,我也不知道这些未知信息是什么。要找到所有的未知信息,需要与业务人员进行反复的讨论才行。

  对于 TechLead 的这张照片来说,颜色的分布似乎是随机的。他只用了三种颜色,并且没有提到其他限制,因此我们暂时也做这种假设。另外我们还假设,这些颜色可能是相同的。

郑州做×××多少钱:http://mobile.zztjyy.com/

  为了保证算法的有效性,因此我假设我们使用的是 100x100 的网格,以避免处理1行10000列这样的极端情况。

  在一般情况下,我会在查看数据的最初几个小时内询问所有这些问题。这也是 TechLead 真正关心之处。应聘者需要思考,是要从编写一个随机解决方案开始,还是要首先找出问题所在。如果提前计划的话,这些问题将更容易处理。在解决这些问题之后,我们最终只需重写代码的一小部分即可。