任何人有任何好的FizzBuzz类型的问题不在该 FizzBuzz问题?
我正在面试某人,而FB是相对知名的,并不难记住,所以我寻找创意的第一站就是我的新瘾。
Answers:
我已经看到一小部分相对简单的编程问题,用于淘汰候选人,就像FizzBuzz一样。以下是我见过的一些问题,按照难度递增的顺序排列:
这些是针对Java的,您可以使用标准库,因此其中的一些库非常简单(例如6)。但是它们像FizzBuzz一样工作。如果您对编程有所了解,那么您应该可以很快完成。即使您不太了解该语言,您也应该至少能够在做某事的背后给出想法。
使用此测试,我以前的一位老板看到了所有东西,从快速完成所有任务的人,到可以很快完成所有任务的人,再到一个半小时后无法回答任何一个的人。
我还应该指出:他让人们在执行这些任务时使用他的计算机。明确指示他们可以使用Google等。
也许这不能直接回答您的问题,但是我不确定您是否需要提出另一个问题。除了“容易记忆”之外,FizzBuzz问题也很简单“容易”,这就是重点。如果您要采访的人属于FizzBuzz是“知名”的人群,那么他们属于FizzBuzz类型的问题不会被过滤掉的人群。那并不意味着您当场雇用他们,而是意味着他们应该能够轻而易举地接受采访。
换句话说,任何花时间阅读《恐怖编码》的人都值得进一步采访。只是让他们迅速地写出解决方案,简要讨论一下(例如,您如何测试它?),然后继续下一个问题。正如文章所说,“真正令人惊讶的是有多少候选人没有能力完成最简单的编程任务。”
我发现检查一个字符串是否是回文是一个非常简单的字符串,可以是一个不错的除草剂。
scalar(reverse 'foo') == 'foo'
。
我想要一个不涉及模运算符的FizzBuzz问题。特别是因为我通常会采访那些不经常使用模运算符的Web开发人员。而且,如果这不是您经常遇到的问题,那么它就是您需要几次查找这些问题之一。
(当然,这是一个概念,理想情况下,您应该在数学课程中的某个地方遇到过,但这是一个不同的主题。)
因此,我想出的就是我所谓的“ 倒数第三”。指令是:
编写一个程序,以相反的顺序打印出1到200之间的3的倍数。
按正常顺序进行操作很容易:将循环索引乘以3,直到达到超过200的数字,然后退出。您不必担心会终止多少次迭代,只需继续进行直到达到第一个太高的值。
但是倒退,您必须知道从哪里开始。某些人可能会直观地意识到198(3 * 66)是3的最高倍,因此,将66硬编码到循环中。其他人可能会使用数学运算(整数除法或浮点数分别为200和3的floor())来计算该数字,并在此过程中提供更通用的方法。
从本质上讲,这与FizzBuzz属于同一类问题(循环遍历值并将其打印出来)。这是一个要解决的问题,它不使用(相对)深于模运算的东西。
print [x for x in xrange(3, 200, 3)][::-1]
斐波那契(Fibonacci),反向字符串,计数字节中设置的位数是其他常见的位数。 欧拉计划也有越来越多的难题。
对于可以在10秒内完成但确实会删除根本无法编写任何程序的人员的真正超级简单的操作,请尝试以下操作:
问:向我展示(在纸上,但在白板上更好)如何交换两个变量的值。
这不是我的主意,而是在一个有关原始FizzBuzz问题的博客文章中,一个名叫Jacob的人的评论中发布的。
雅各布接着说:
如果他们不从创建第三个变量开始,那么您几乎可以注销该人。我发现仅凭该问题,我就可以减少三分之一(一半的筛选申请人数)。
在原始博客文章的评论之后,还有进一步的有趣讨论,内容涉及在不需要第三个变量(加/减,xor等)的情况下执行此变量交换的方法,当然,如果您使用的语言支持此功能,在单个语句/操作中,这可能不是一个很好的测试。
尽管不是我的主意,但我想在此发布此问题,因为这是一个非常优雅,简单的问题,即使编写了最简单的程序,也可以(并且应该)在大约10秒内回答。它也不需要使用像模运算符这样的表面上晦涩难懂的运算符,很多人本来是相当好的程序员,但他们根本不熟悉(我从我自己的经验中知道)。
要求他们编写一个应用程序以返回给定数字的因数。在短期内容易做到而又很难做好。您可以在短时间内看到他们的风格以及他们对问题的思考方式。
从C ++ FAQ Lite中检出6.14:
怎么样:我想使用一个整数来存储多个值。描述这将如何工作。
如果他们对位掩码和操作一无所知,则可能无法解决其他问题。