算法问题是好的面试问题吗?[关闭]


25

我最近和一位程序员发生了争执。他正在面试新职位,并被问到以下问题:

给出一个从X到Y的数字序列,但缺少一个元素,因此N为YX-1,在O(N)或更优的位置找到丢失的元素。

现在,答案在这里无关紧要(但很有趣)。这就开始了关于是否在面试中问这个问题的讨论。

一方面:算法是编程的继承部分,并且候选人有能力回答这个问题,这证明该候选人将是一名优秀的程序员,并且能够解决更大的问题,并能够处理最终易于理解和回答的大多数编程任务。

另一面:从头开始编写算法很少在现代编程中使用,因此与一个人是否会成为一个好的程序员这一更大的问题无关。一个人可以成功回答此问题,但仍然无法执行更多常见的编程任务。

你的想法?好面试问题吗?


很抱歉,但是我不明白在这种情况下find the missing element in O(N) or better意味着更好”是什么意思?似乎可以通过一个简单的while循环来解决这类问题,但是无论如何我还是不明白-它要么已经解决,要么没有解决,对吧?
卡米洛·马丁

“或更好”是指性能-O(ln(n))解决方案会更好。
Ethel Evans,

算法问题实际上是编程或技术工作面试中的预期问题之一。Gayle Laakmaan McDowell写了一本书,名为“ Cracking the Coding Interview”,其中专门讨论算法。
hagubear13年

Answers:


20

我同意询问算法问题,但不同意坚持特定的big-O质量水平。

提出这样的问题很有趣,以了解该人如何解决问题以及他们在尝试中会遇到的陷阱,但是除非他们写出了一些错误或效率低下的东西,否则他们所写内容的实际细节并不能说明他们以连贯的方式完成问题解决/设计步骤。

我问一个类似的问题,但是我受雇后最幸运的人是给出错误答案但在方法上有正确想法的人。


9

我不同意这样的想法,即编写算法的能力与这个人是否会成为一个好的程序员这个更大的问题无关。即使他永远不必使用它(这是令人怀疑的),它仍然显示出他是否具有为解决一个逻辑问题所需的思维灵活性,该问题的解决方案比已经编写并提出的一组简单要求更为复杂由客户详细说明。

我绝对不想雇用一个不知道如何思考和分析的人。这就是代码猴子和计算机程序员之间的不同之处。


6

我必须在这里承认,我是喜欢在面试中提出算法问题的人之一,但我要强调的是,问题的实际答案是绝对无关紧要的。无论被访者是否知道答案,我都不会在乎。相反,对我来说,这个问题针对重要性的不同方面,如下所示-按重要性排序:

要求

此类问题故意未明确说明。在您的示例中,没有提供有关该序列的更多详细信息。如果您有一个受访者问您这些数字是否实际排序,那么这是一个好兆头。他有正确的心态向客户询问更多细节,这将有助于在较短的时间内找到更好的解决方案。候选人还可以考虑使用O(n)空间存储N个数字的数组,但是他不应该询问X和Y的更多详细信息。比如说X和Y在1到1000之间,那么可以肯定,并启动基于阵列的解决方案。但是,如果我告诉您间隔是1到10亿,那么问题就变成了完全不同的问题。让我再次强调,我不在乎解决方案。

标准技术

我不想雇用一个甚至都不知道O(n)意味着什么的程序员。如果您在该领域接受过体面的教育,那绝对是一个必须知道的事情。但是重要的是,不仅要知道它的含义,而且还要实际应用这些知识。在您的示例中,我希望应聘者意识到由于需要排序O(n log n),因此不允许他对数据进行排序(不问其他针对桶排序或其他O(n)排序方法的问题)一般来说。

同样,其他算法问题也针对标准技术,例如树或图遍历或递归。候选人可能会滑过其中一种技术,但印象不佳。但是,在这种情况下,我想更深入地了解候选人是否具有任何CS背景。当然,这取决于目标位置,但是通常不了解运行时复杂性,典型数据结构及其遍历的开发人员将无济于事。

应对问题的心态

提出问题后,您将密切监视候选人。他/他如何反应?你从谁对如何解决问题丝毫没有线索考生在这里得到最好的结果,在第一。在这方面,该问题检查了如果以后在工作场所发生类似情况会发生什么情况。在开发过程中,您可能会遇到这样的问题,即使您的候选人不能独自解决所有问题,也最好知道您的候选人如何处理这些问题。

示例:您不希望候选人在接下来的半小时内进入静音模式!检查他是否可以提出聪明的问题(请参阅要求),一旦发现自己无法做到,就检查他是否开始思考。甚至是一个“有趣”的反问,例如“我可以使用同事电话选项吗?” 是一个好兆头。

怎么回答

通常,您可以针对此类问题给出的最佳答案是反问题!马上说出答案基本上不会使整个事情成功,而且实际上根本不是一个好的答案,因为所有这些问题都暗示了折衷,这是您的答案所隐含的,而您却没有所需的信息来明智地做到这一点。交易。当然,不同候选人之间反问题的质量会有所不同。

作为关于面试问题的一般说明:反问很少是一件坏事。例如,在我自己的一次采访中,我被问到类似以下内容:“如果必须实现X,那么您会选择C ++还是Java,为什么?” -我只是反驳说“我仅限于这两个吗?”。为自己猜测一下,您会从面试官那里对这样的反问做出什么样的反应-以及使您真正向面试官展示您的能力的难易程度。


为什么显示“我可以使用同事电话”选项吗?好兆头?这是否表明被访者不知道如何解决问题并总是寻求帮助?
Uooo

总会有一个问题,受访者根本无法回答。在这种情况下,这是一个好兆头,但是,当然,受访者不应针对几个问题重复这种行为。艰巨的任务是找出,如果您只是碰到了那个甜蜜点,候选人不了解任何知识(这是可以接受的),或者他是想摆脱一般性难题(不是)。
Frank

曾经有人告诉我,初级开发人员和高级开发人员之间的区别是高级开发人员会尽快寻求帮助。打电话给同事是一项重要技能。这个行业有很多自负,说“我不知道”是一个好兆头。我曾经设计/编写的一些最佳代码来自与人的合作,而不仅仅是我自己的想法。
MBonig '16

5

除非您询问有关算法/公式的问题,否则应聘者必须了解该工作(例如流体动力学,例如,如果职位要求的话),否则我看不到它们的价值。候选人可能已经在担心他们的着装,说话方式等……他们是否可以当场回答数学问题,除了证明他们在电视游戏节目中的表现如何之外,并不能证明其他任何事情。

当我面试时,我什至不问“编程”问题本身。我让应聘者描述他们过去的项目,他们的代码如何实现目标,他们的方法是什么,等等。由此我可以很快地得知应聘者是否知道他在做什么,或者他是否是摆姿势。


4

我同意,即使使用新颖的框架,程序员也必须非常了解算法,但是在面试中我并不完全相信脑筋急转弯。我最大的担心是,在实际环境中,您将在完全不同的条件下编写算法;亦即,不要在有人每次击打时都看着他的压力下,至少有几分钟的时间来静静地思考。对于那些主张使用这种评估方法的人,您通常给该人多长时间来解决它?我相信代码并不仅仅是在发狂的3分钟恐怖中提出解决方案,所以让我相信,这实际上是查看某人如何处理日常任务的好方法。


2

该特定问题的问题在于,这几乎是一个技巧问题。有一个特殊的见解,您会很容易想到O(n),否则您将很难变得比O(nlogn)好。几乎变成了“您以前看过这个吗?”

我不确定是否有任何好的算法问题。如果您问一个基于图论的人,那将取决于被访者对图论的熟悉程度,并且,如果您雇用他或她,他或她可能会很快掌握图论。再一次,我们回到“您以前接触过吗?”

定期面试没有时间进行认真的问题解决,当我坐下来使用Wikipedia并通常花一些时间来解决问题时,我会采取不同的方法。面试官可能没有时间仔细地讨论面试官所知道的细节并找出合适的算法问题。


1
看到O(n)有什么特别的见解?我看到“在搜索N个顺序值的排序列表中查找缺失的值”本质上是一个O(n)问题。您怎么能写得更糟呢?(老实说,我很好奇,不知道O(n)解决方案是不是很明显,甚至O(log n)对我来说也是显而易见的。)
dash-tom-bang 2010年

@ dash-tom-bang:我不是认为列表是经过排序的(我是否误解了?),因此O(n log n)解决方案将进行排序和扫描,而O(n)将对数字求和起来
David Thornley,2010年

嗯-可能是这样-我没有考虑过该列表是未排序的。:)(“列表开始于X,结束于Y。”)
dash-tom-bang 2010年

2
快速选择的变体在这里也适用。在(顶部+底部)/ 2上旋转,可以很容易地看到缺少的条目的一半,因为您知道每半应该有多大。重复直到找到缺少的元素。
Paul Hankin

1
我认为问题是指从X开始到Y结束的序列(而不是集合等),这意味着要对项目进行排序。这确实是一个相当琐碎的问题。
FinnNk 2011年

1

我经常遇到几个类似算法的问题,其中一些非常困难。我用它们来观察他们如何从精神上解决问题,并看他们是否迷惑了某些概念。(我已经看到太多不了解指针的开发人员候选人。)


指针,像狗,对不对?:)
JoshD 2010年

1

您想要一个可以使您深入了解候选人的问题。算法问题可能会很好地回答,也可能不会。我并不是说他们能够回答这个问题。如果他们能够做到这一点,并且您理解并遵循他们的推理,那将是一个很好的指标。如果他们只是坐在那里,没有真正的反应,似乎甚至都不知道从哪里开始,那是一个糟糕的指标(也许)。问题是有些人会冻结,将冻结与没有解决问题的技能区分开可能很困难。

人们会出于各种原因抱怨在面试中几乎询问任何问题。申请人可能会冻结,申请人可能只是查询了该问题,申请人可能不知道该特定琐事/技术/相关内容。所有这些都是正确的,但是面试仍然需要进行,而且我们这个行业的许多人对此都不满意。我们讨厌有人坐在我们的判断中。我们立即想出为什么我们会受到不公正的判断,或者该测试可能是虚假的还是被博弈的原因。最重要的是,没关系。

您真正想要的是一位能够确定在面试过程中可能会或可能不会出现的技能的面试官。问题只是工具。在我看来,所有锤子看起来都一样。但是对于一个对他们足够熟练的人来说,我敢肯定有区别。


0

我喜欢算法问题,因为这就是我们的工作。我喜欢约束,因为这就是我们使用的约束。Big-O在我的行业中尤其重要。

我不喜欢要求对此类问题的答案是“在白板上编写代码”。被访者应该能够聪明地谈论解决方案的方法,并可以在访谈者在讨论进行过程中更改要求时进行持续的讨论。

受访者说,最初的问题被问到:“从头开始,朝着末端前进,寻找'洞'”。采访者说这太慢了,因为N很大。受访者开始讨论二进制搜索。采访者说,所有突然的数据不再被排序。受访者说“先分类再搜索”。“现在太慢了”。等等

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.