在面试中,为一个棘手的问题编写暴力解决方案还是花点时间仔细地检查问题是更好的选择吗?[关闭]


14

有时候,面试问题很难,无论面试官是否打算如此。可以选择使用有限的采访时间来编写丑陋,低效,蛮力的解决方案,还是花时间与采访者一起了解问题的各个方面。

例如,可以通过计算每个可能的三角形,编写isRightTriangle()测试并将通过测试的所有三角形弹出到集合中的不太困难的蛮力解决方案来解决Euler项目中的问题91。但是两对X / Y坐标使O(x ^ 4)解具有较高的恒定值。我和一个朋友提出了一个更加优雅,高效的解决方案,但是我们两个人花了3个小时在上面,绘制了数十张图表,测试了多种公式,研究了多种方法,等等。

并非每个面试问题都是公平的。同样,对一个人来说简单的事情对另一个人来说可能很难。如果有人在为一个问题而苦苦挣扎,那么有效的蛮力丑陋解决方案会让您印象深刻吗?还是出色的问题理解能力和无懈可击的解决方案,但却没有编码解决方案?是否有类似20分钟后的规则,无论如何都应该开始编码?


10
询问他们是否需要强力解决方案,或需要细微差别的解决方案。
罗伯特·哈维

如果他们想要一个非暴力的解决方案,他们会首先提出一个暴力不能解决的问题。
减去2013年

Answers:


9

首先,一个需要两个经验丰富的开发人员三个小时才能完美优化的问题对于面试问题来说是一个糟糕的选择。如果您提出要求,则不应期望得到完美的答案。

另一方面,有时候当您使某人达到极限时,您会对其了解最多。这就是为什么许多大学课程都增加难度然后在曲线上评分的原因。如果每个人在每次考试中得分都达到100%,那么您将失去很多潜在的学习机会。

我理想的候选人可能会先进行复杂度计算,然后说“哦,那只有600万次迭代,不会花很长时间”,然后迅速编写蛮力解决方案。然后,他们将讨论可以采取的优化方法,除非受访者要求,否则不必实施这些方法。

在某种程度上,这是因为现实世界中出现的许多项目欧拉类型问题都是一次性解决的问题,您需要解决一次然后再将其忘记。我想知道,如果您只需要花2分钟才能编写并运行10分钟的暴力算法,我雇用的某人就能比3小时编写并花费10秒的算法更有效。一次运行它。


好答案。Caleb提出了先进行蛮力先优化的概念,但您的唯一答案表明了在这种情况下可以接受蛮力解决方案的原因,“那只是600万次迭代,不会花很多时间很长。” 那只是金子。非常感谢!
GlenPeterson

14

作为一名招聘经理,如果我要您解决我面前的代码问题,我要做的并不是查看代码本身(尽管很重要),而是确定其方式和原因你做了你所做的。您可能要做的事情之一不是编写代码,而是向我询问问题本身的各个方面,以便更好地解决问题。这对我来说很有意义,通常比代码中提出的解决方案更有意义。但是,这不是每个人都这样做,也不是每个人都想看到的(事实上,我很少要求人们在面试环境中进行编码,但是我确实将问题摆在桌面上,我们讨论这些问题,有时还会出现伪代码,对我也一样)。

您是对的,并非每个面试问题都是公平的,在这种情况下并在那些约束下,对某人来说容易做的事对另一个人来说是困难的,这就是为什么那些了解这些面试的人通常并不在寻找代码解决方案(尽管同样,这确实起着重要的作用),而是解决过程

“是否有一条规则,例如20分钟后您应该不管怎么开始编码?” 我的回答是,在思考问题的很短时间内,您至少应该做些事情 -提出更多问题,草拟解决方案的框架,或者说您做不到/不知道从哪里开始。

如果我在您面前遇到一个难题,并且由于时间和条件的限制,您提供的解决方案是蛮力和丑陋的,那么我会问您一系列问题,为什么是这样,它将使它变成更优雅的东西:更多信息?更多时间?不同的环境?自我意识并了解您做过什么,做过什么的原因以及能够合理地解释它的原因,这是我书中的一大亮点,但这些都是我开发的那种寻找。因此,“出色的问题理解能力和寻求优雅解决方案的途径”也对我有用,但不是所有人。


6
再加上一百万美元的奖励是“自我意识和与您所做的和未完成的原因保持联系,并能够合理地解释它,这是我书中的一颗金牌。” 被问到“为什么?”而只是创始人却无法回答的人的数量令人难以置信。招聘时,我几乎总是喜欢教一个可以自己思考的人,而不是雇用一个可以但不能思考的人。
2013年

谢谢。这是有见地的。我的工作倾向是在触摸键盘之前先进行分析。但是在面试的压力下,我想拼搏地展示一个解决方案的程序员们 。stackexchange.com/ questions / 178075 /…您的回答提供了一个值得记住的反例。
GlenPeterson

4

我都想要,但是他们可能会在一个解决方案中显示一个“有效的代码”,然后可能讨论在一个或另一个问题上进行改进的潜在解决方案。

如果您要求某人编写代码,而他们只是想谈论零代码的可能解决方案,那将是一个问题。

就像您说的那样,某人可能会出于某种原因而在特定问题上挣扎,但是您必须学习他们如何解决这些问题。他们可能会很幸运,并且已经听说过类似问题的解决方案。它发生了。

观察某人编写足够的代码并进行讨论,然后您就可以确定他们是否适合该工作。


1
我想我也想听听为什么蛮力解决方案可能是一个问题,就像上面的问题一样。
Christopher Creutzig

@ChristopherCreutzig-我认为如果不至少提出当前解决方案存在的问题,就很难进行改进。
JeffO

真正。我想我会抓紧。
Christopher Creutzig 2013年

3

是否有类似20分钟后的规则,无论如何都应该开始编码?

不,但是如果您在开始工作之前花20分钟分析问题,则可能已经遇到麻烦了。像您引用的问题一样询问您的雇主最感兴趣的是您如何解决问题,但是如果他们将其作为编码问题来询问,他们也会希望看到一些代码。在您的思考过程中与他们交谈...

好吧,这里显而易见的方法是蛮力。如果我有办法在给定三个顶点的情况下识别直角三角形,则可以遍历两个点的所有组合以及寻找直角三角形的原点。那不应该很难-我可以编写一个使用勾股定理来识别直角三角形的函数。为了简化操作,我还将编写一个函数,该函数使用距离公式来确定两点之间的距离...

编写这些功能大约需要三分钟。现在,仅需几分钟,您就可以证明自己记得基本的几何图形,并且确实知道如何编写代码。它还给您一些话题:

因此,我们显然可以将isRightTriangle(p1, p2, p3)函数放在四个for循环的中间,并对两个变量点中的每一个的所有可能选择进行迭代。让我们看看...问题要求的直角三角形数量包括50x50网格上的原点,因此使用蛮力方法使我们可以检查每个点的每个坐标的50种可能性。那是50 ^ 4个检查...我确定我们可以做得更好,但是代码很明显,所以让我写下来...

因此,现在您编写一个使用嵌套for循环的isRightTriangle()函数以及您刚编写的函数。您已经解决了问题,但同时也让面试官了解您的去向。如果他们的目标只是希望您可以编写代码,那么他们可能会告诉您停止。他们很可能会与知道自己在做什么的人交谈,并且很想知道您能走多远。所以你继续...

在我写作时,我想到我们可以利用对称性。我们可以在45°线周围反映任何给定的直角三角形,因此,如果我们选择仅检查该线的一侧上的点之一,我们就可以算出我们发现两次的任何直角三角形……一次是三角形,一次是对于它的反思。这样可以将支票数量减少一半。另外,现在看,我们要求平方根以找出两点之间的距离,但然后再次将其平方成isRightTriangle()...

等等。同样,他们通常不希望看到理想的解决方案,而是希望了解如何获得解决方案。您的思维过程不必像上面的那样-只是有信心大声思考将非常重要。如果您犯了一个错误,请不要流汗-只是说:“嗯,我想我已经离开这里了-让我后退一步……”


1
很好的答案。我特别喜欢:“我敢肯定我们可以做得更好,但是代码很明显,所以让我写下来……”
GlenPeterson

3

作为一名经理,如果我要求您编写代码作为测试,我对以下方面最感兴趣:

  • 是否可以编写代码
  • 您的编码风格
  • 您选择的算法
  • 尝试是否表明您了解问题
  • 如果我真的对某个特定技术很感兴趣,那么您是否证明自己或多或少都知道它。

第一项可能看起来很疯狂,但您会感到惊讶...

编码样式-我的意思不仅是指将括号放在哪里,还包括以下内容:

  • 您是否选择组合或继承来解决该问题?为什么?
  • 对于该值,为什么选择使用枚举vs.字符串vs. int(或任何适用的排列)
  • 您是否为此值使用属性,字段或获取/设置方法?为什么?
  • 您如何在课堂上处理状态?
  • 您了解继承,接口和lambda如何工作吗?
  • 您是否了解该语言的参数约定(什么是ref还是按值?)
  • 您知道如何编写单元测试吗?

这是我真的关心:

  • 它可以编译(假设我只是给您记事本而没有编译器)
  • 你通过记忆知道那一个函数中那两个参数的顺序
  • 可以背诵SQL Server或Oracle连接字符串
  • 当我站在您的肩膀上看着所有错误时,您可以完美地编码。

老实说,我从来都不是编码测试的忠实拥护者,只是作为一种分析风格的工具。


1
我也不是编码测试的忠实拥护者。欧拉计划中的问题是有趣的脑筋急转弯,也是培养解决问题能力的好方法。但是,如果您主要是在编写CRUD应用程序,那么最好知道候选人是否知道如何编写良好的数据库查询,或者,如果您像我一样在.NET世界中,如何正确使用MVC,WCF,WPF和LINQ。
jfrankcarr

1
我要补充一点,就是语义甚至都不重要,而不是了解这些问题解决了什么类型的问题,何时何地重要以及它们带来的任何不利影响。
钻机

@jfrankcarr-如何确定某人是否可以编写SQL而无需某种测试?
JeffO 2013年

1
@JeffO-我通常喜欢通过基于简历或常见情况的对话来做到这一点。例如,“您是否在查询中使用表变量或临时表?” 或“您如何将旧数据查询集成到新应用程序的设计中?” 如果我正在招聘初中,刚毕业的程序员,我可能会求助于测试,但我更喜欢开放式对话方法。
jfrankcarr

1

在那种情况下,寻求一个优雅的解决方案要比一个糟糕但完整的解决方案好。两种情况都很好。写下pusdocode绝对是件好事,即使您没有任何时间对程序进行实际编码,它也可以证明您了解该问题以及如何解决该问题。


1

我认为您是在问一个实际上没有答案的问题,更不用说“正确”的答案了。我说这的原因是,这完全取决于询问问题的人的价值观。

面试官很有可能是一位顽固的实用主义者,他确实希望看到您很快就会工作,然后在有剩余时间的情况下将其优化为优先级较低的活动。同样有可能的是,面试官对Google的聘用方式印象最深,除了最性感,最优雅的算法外,对其他任何东西都不感兴趣。彼此之间不超过5个字。面试官也有可能在您进入网站前5分钟搜索了“面试问题”,并在互联网上发现了这个问题,却不知道他想要什么。

在所有情况下,如果您不能根据上下文信息推断出面试官想要什么,最好的选择就是要求澄清。没错,并不是所有的面试问题都是公平的,事实上,并非所有的面试问题都是好问题甚至是有意义的问题。采访本质上是一种还原主义活动,就像“快速约会”一样,您与某人共度一两个小时,而你们两个试图根据那个小时猜测下一次是否会很好地工作5年与否。从这个角度来看,我希望更清楚为什么我说对您关于“规则”的问题确实没有答案。

有人在问您一个问题,他们认为这些问题可以使您深入了解自己的能力并适合他们的团队。您必须查看他们的团队,对他们的了解,面试者的个性以及许多其他因素,并最好地猜测他们可能会重视的答案,方法和过程。就个人而言,我想您应该以自己认为是最好的主意的方式来对待它。如果他们不同意您的想法,那么无论如何它都可能不会很适合您-更容易早点弄清楚这一点。


0

无论如何,面试官都会要求您改善解决方案。

而“首先解决暴力问题”的方法有一个无可争辩的优势:如果您找不到理想的解决方案,那么您仍然可以完成一些工作来展示它们。


1
“无论如何,面试官都会要求您改善解决方案。” 对我来说似乎是一场赌博。
Craige

1
@Craige:不是。但是,如果他们不提出来。说这是蛮力解决方案,可以通过分析加以改进。
马丁·约克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.