替代性FizzBu​​zz问题


88

任何人有任何好的FizzBu​​zz类型的问题不在 FizzBu​​zz问题?

我正在面试某人,而FB是相对知名的,并不难记住,所以我寻找创意的第一站就是我的新瘾。

Answers:


103

我已经看到一小部分相对简单的编程问题,用于淘汰候选人,就像FizzBu​​zz一样。以下是我见过的一些问题,按照难度递增的顺序排列:

  1. 反转字符串
  2. 反转句子(“鲍勃喜欢狗”->“狗喜欢鲍勃”)
  3. 在列表中找到最小值
  4. 在列表中找到最大值
  5. 计算余数(给定分子和分母)
  6. 从包含重复项的列表中返回不同的值(即“ 1 3 5 3 7 3 1 1 5”->“ 1 3 5 7”)
  7. 返回不同的值及其计数(即上面的列表变为“ 1(3)3(3)5(2)7(1)”)
  8. 给定一串表达式(仅变量,+和-)和一组变量/值对(即a = 1,b = 7,c = 3,d = 14),返回表达式的结果(“ a + b + c -d“将为-3)。

这些是针对Java的,您可以使用标准库,因此其中的一些库非常简单(例如6)。但是它们像FizzBu​​zz一样工作。如果您对编程有所了解,那么您应该可以很快完成。即使您不太了解该语言,您也应该至少能够在做某事的背后给出想法。

使用此测试,我以前的一位老板看到了所有东西,从快速完成所有任务的人,到可以很快完成所有任务的人,再到一个半小时后无法回答任何一个的人。

我还应该指出:他让人们在执行这些任务时使用他的计算机。明确指示他们可以使用Google等。


对于第8项,是否可以接受基于JSR-223(javax.script)的解决方案?:-P(公认的使用完全是矫kill过正,但是有些人宁愿这样做而不是使用java.util.Scanner。)
Chris Jester-Young

4
这不是我对问题实质的理解,但是,如果您知道足够多来提出该建议,那么您当然知道足以通过FizzBu​​zz问题,所以我不会反对您。它甚至可能对您有利。我仍然可能会问,如果没有javax.script,您将如何做。
MBCook

3
我已经阅读了一段时间你的答案,无法弄清楚发生了什么,为什么我不喜欢它,问题是你的问题对代码不好玩:)(没关系,因为这是故意的进行采访)。此评论没有真正意义,只是想将其从我的系统中删除。:)对不起所有笑脸
Trufa 2010年

1
希望看到数字8的示例解决方案。前7个是轻而易举的事,但对我来说,8(与我相比)似乎要复杂一些。我正在Python 3.x中进行开发,这是一个完全不同的游戏。可能只是我不知道的事情。
DonutSteve

31

也许这不能直接回答您的问题,但是我不确定您是否需要提出另一个问题。除了“容易记忆”之外,FizzBu​​zz问题也很简单“容易”,这就是重点。如果您要采访的人属于FizzBu​​zz是“知名”的人群,那么他们属于FizzBu​​zz类型的问题不会被过滤掉的人群。那并不意味着您当场雇用他们,而是意味着他们应该能够轻而易举地接受采访。

换句话说,任何花时间阅读《恐怖编码》的人都值得进一步采访。只是让他们迅速地写出解决方案,简要讨论一下(例如,您如何测试它?),然后继续下一个问题。正如文章所说,“真正令人惊讶的是有多少候选人没有能力完成最简单的编程任务。”


7
好答案。“ FizzBu​​zz很容易,这就是重点……任何花时间阅读《恐怖编码》的人都值得进一步采访。” QFT。我经常问应聘者“你去哪里读编程?” 令我惊讶的是,有多少人无法提及一个博客,网站或书籍。
Noah Sussman 2012年

1
我不同意。上周我们采访了某人,并从接受的答案中询问了他们#3。他们从字面上说:“哦,我正在期待嗡嗡声”,然后无法回答我们的问题。
frandroid

23

欧拉计划中的任何早期版本都可能很好。

例如:

问题25

斐波那契数列由递归关系定义:

Fn = Fn−1 + Fn−2, where F1 = 1 and F2 = 1.

因此,前12个术语将是:

F1 = 1
F2 = 1
F3 = 2
F4 = 3
F5 = 5
F6 = 8
F7 = 13
F8 = 21
F9 = 34
F10 = 55
F11 = 89
F12 = 144

第12个术语F12是包含三个数字的第一个术语。

斐波纳契数列中包含1000个数字的第一项的索引是什么?


14

我发现检查一个字符串是否是回文是一个非常简单的字符串,可以是一个不错的除草剂。


我会说这取决于语言。在C语言中可能很有趣,在Perl中,它已经完成了scalar(reverse 'foo') == 'foo'
jkramer

3
是的,但是同时,能够看到更简单的解决方案很有价值……然后您说:“好吧,现在假装您没有反向功能。”
Mike Stone

1
在C ++中,对于不涉及手写循环的任何“功能”解决方案,我都会给予加分。例如,“返回等于(str.begin(),str.end(),str.rbegin());” 或(对于速度怪胎)“返回等于(str.begin(),str.begin()+ str.size()/ 2,str.rbegin());”
克里斯·杰斯特·杨

1
当然,看到这样的答案后,我也会请应聘者解释代码的工作原理。仅复制我上面的回答,他们就无法站起来!:-P
克里斯·杰斯特·杨

10

我想要一个不涉及模运算符的FizzBu​​zz问题。特别是因为我通常会采访那些不经常使用模运算符的Web开发人员。而且,如果这不是您经常遇到的问题,那么它就是您需要几次查找这些问题之一。

(当然,这是一个概念,理想情况下,您应该在数学课程中的某个地方遇到过,但这是一个不同的主题。)

因此,我想出的就是我所谓的“ 倒数第三”。指令是:

编写一个程序,以相反的顺序打印出1到200之间的3的倍数。

按正常顺序进行操作很容易:将循环索引乘以3,直到达到超过200的数字,然后退出。您不必担心会终止多少次迭代,只需继续进行直到达到第一个太高的值。

但是倒退,您必须知道从哪里开始。某些人可能会直观地意识到198(3 * 66)是3的最高倍,因此,将66硬编码到循环中。其他人可能会使用数学运算(整数除法或浮点数分别为200和3的floor())来计算该数字,并在此过程中提供更通用的方法。

从本质上讲,这与FizzBu​​zz属于同一类问题(循环遍历值并将其打印出来)。这是一个要解决的问题,它不使用(相对)深于模运算的东西。


2
我很好奇Legion:您的Web开发人员如何做无模数的绿色限制/替代行之类的事情?
安德鲁·伯恩斯

4
好吧,如果您只是想通过使用CSS3的nth-child选择器将样式应用于交替的行。jQuery也具有交替选择器,可以通过JS进行此类操作。但是,从更大的角度来讲,就像我在上面说的那样,它被查找,使用并很快被遗忘了,因为它花了整整15秒的时间才能找到。我并不是说我喜欢或赞成,但尤其是在入门级,它确实会发生。:)
军团再临》

1
这是我的PHP解决方案:) ideone.com/BnJQ3 3分钟:)
Trufa 2010年

在低级语言中,这一定会更加困难,因为在Ruby中,这就像将数字(按顺序)推入数组,然后反转整个数组一样容易。ideone.com/MKKb6
克里克(

Python:print [x for x in xrange(3, 200, 3)][::-1]
beatgammit 2012年

8

斐波那契(Fibonacci),反向字符串,计数字节中设置的位数是其他常见的位数。 欧拉计划也有越来越多的难题。


斐波那契(Fibonaaci),虽然稍微先进一点,但它是一个不错的选择,我是完全的新手,我花了20-25分钟的时间,以便您参考:)
Trufa 2010年

我遭到了Fibonacci,FizzBu​​zz的攻击,并删除了数组中重复的整数-今天全部在一次采访中(4小时)
IAbstract

8

对于可以在10秒内完成但确实会删除根本无法编写任何程序的人员的真正超级简单的操作,请尝试以下操作:

问:向我展示(在纸上,但在白板上更好)如何交换两个变量的值。

这不是我的主意,而是在一个有关原始FizzBu​​zz问题的博客文章中,一个名叫Jacob的人的评论发布的

雅各布接着说:

如果他们不创建第三个变量开始,那么您几乎可以注销该人。我发现仅凭该问题,我就可以减少三分之一(一半的筛选申请人数)。

在原始博客文章的评论之后,还有进一步的有趣讨论,内容涉及在不需要第三个变量(加/减,xor等)的情况下执行此变量交换的方法,当然,如果您使用的语言支持此功能,在单个语句/操作中,这可能不是一个很好的测试。

尽管不是我的主意,但我想在此发布此问题,因为这是一个非常优雅,简单的问题,即使编写了最简单的程序,也可以(并且应该)在大约10秒内回答。它也不需要使用像模运算符这样的表面上晦涩难懂的运算符,很多人本来是相当好的程序员,但他们根本不熟悉(我从我自己的经验中知道)。


1
我认为这是一个很好的主意。在候选人痛苦地调试程序的同时,想知道他们为什么使用foreach而不是for以及如何解决该问题,这肯定比坐在那里等待20分钟要好得多!(正如我刚才所做的)
迈克·内尔森

std :: swap(a,b); 为什么要创建第三个变量时,几乎所有的标准库曾经将愉快地为我做呢?

@Dan-想法是要求您执行此操作,而不使用任何库,仅使用所选语言的内置关键字。当然,在现实世界中,您可以使用库例程来实现此目的,就像使用库例程来(例如)链表结构而不是编写自己的库例程一样。该测试的重点在于它足够简单,并且可以毫无疑问地期望任何候选人都可以做到这一点而无需借助图书馆来实现它。
CraigTP

那么,雅各布是否建议受访者使用第三个变量?我已经看到该问题的替代方法,它要求开发人员不要使用第三个变量。他说出答案的方式很模棱两可。
theGreenCabbage 2014年

1
作为一个认为自己只是一个“还可以”的程序员的人,这使我感到恐惧。我立即想到的是“亲爱的上帝,我会使用第三个变量,但是他肯定希望有一些聪明的方法来做到这一点!”
魔鬼的代言人

4

要求他们编写一个应用程序以返回给定数字的因数。在短期内容易做到而又很难做好。您可以在短时间内看到他们的风格以及他们对问题的思考方式。


2

返回字符串X在字符串Y中第一次出现的索引

实现strstr()需要对语言有基本的了解,同时还要提供巧妙的优化机会。


2

如果是C / C ++面试,请确保此人了解指针。

常规-简单算法([单/双]链表)。问一下每种情况下添加的复杂性(从一开始,到最后,优化...)?

(常规)如何通过仅3 * N / 2个比较从数组(N个大小)中找到最小值和最大值?

C / C ++:如何优化一个缓冲区的多个“ strcat”?


在我看来,对于问题“您如何仅用3 * N / 2个比较就如何从一个数组(N个大小)中找到最小值和最大值?” 最好弄清楚数字3 * N / 2是数组元素比较的数量,但是您可以例如自由比较int。例如(i <数组大小)循环执行。
sergtk,


0

怎么样:我想使用一个整数来存储多个值。描述这将如何工作。

如果他们对位掩码和操作一无所知,则可能无法解决其他问题。


9
我想说的是,如果在解释或指出了口罩之后,如果这个人没有拍打自己的额头,并以自嘲的方式摇头,那将更有启发性。除非使用C,嵌入式设备或网络,否则位掩码不是常见的习惯用法。很多有才华的人都没有。
Gregg Lind

2
嗯,那么您必须决定是否接受以十进制123计数存储1,2和3作为正确答案,尽管与仅声明3个变量相比,数学将非常复杂。或者通过写x = 1来存储1,2,3; x = 2; x = 3; 我的意思是,我们需要同时存储这些值吗?
马修·马丁

0

查找素数列表是一个相当普遍的问题,但仍需要一些思考,人们可能会给出不同程度的答案。

您还会惊奇地发现有很多人在努力实现Map / Dictionary类型的数据结构。


0

我已经要求我的候选人创建一个程序,以他们选择的任何伪语言来计算给定数字的阶乘。这是一个相当容易解决的问题,非常适合于有关递归的自然跟进要求(经常会被问到)。

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.