备用FizzBuzz问题
有人有不是FizzBuzz问题的FizzBuzz类型问题吗?
我正在面试某人,而FB是相对知名的,并不难记住,所以我寻找创意的第一站就是我的新瘾。
解决方案
斐波那契(Fibonacci),反向字符串,计数字节中设置的位数是其他常见的位数。
欧拉计画也有大量增加难度的收藏。
要求他们编写一个应用程序以返回给定数字的因数。在短时间内容易做到而又很难做好。我们可以在短时间内看到他们的风格以及他们对问题的思考方式。
怎么样:
我想使用一个整数来存储多个值。描述这将如何工作。
如果他们对位掩码和操作一无所知,则可能无法解决其他问题。
查找素数列表是一个相当普遍的问题,但仍然需要一些思考,人们可能会给出不同程度的答案。
我们还会感到惊讶的是,有多少人难以实现Map / Dictionary类型的数据结构。
我发现检查一个字符串是否是回文是一个非常简单的字符串,可以成为一个像样的除草剂。
从C ++ FAQ Lite中检出6.14:
http://www.parashift.com/c++-faq-lite/big-picture.html
我已经看到一小部分相对简单的编程问题,用于淘汰候选人,就像FizzBuzz一样。以下是我遇到的一些问题,按照难度增加的顺序排列:
- 反转字符串
- 反转句子("鲍勃喜欢狗"->"狗喜欢鲍勃")
- 在列表中找到最小值
- 在列表中找到最大值
- 计算余数(给定分子和分母)
- 从包含重复项的列表中返回不同的值(即" 1 3 5 3 7 3 1 1 5"->" 1 3 5 7")
- 返回不同的值及其计数(即,上面的列表变为" 1(3)3(3)5(2)7(1)")
- 给定一串表达式(仅变量,+和-)和一组变量/值对(即a = 1,b = 7,c = 3,d = 14),返回表达式的结果(" a + b + c -d"将为-3)。
这些是针对Java的,我们可以使用标准库,因此其中一些库非常简单(例如6)。但是它们像FizzBuzz一样工作。如果我们对编程有所了解,那么我们应该可以很快完成。即使我们不太了解该语言,我们也应该至少能够在做某事的背后给出想法。
使用此测试,我以前的一位老板看到了很多东西,从快速完成所有任务的人,到可以很快完成所有任务的人,再到一个半小时后无法回答任何一个问题的人。
我还应该指出:他让人们在执行这些任务时使用他的计算机。明确指示他们可以使用Google等。
Return the index of the first occurrence of string X within string Y
实现strstr()需要对语言有基本的了解,同时还要提供巧妙的优化机会。
如果是C / C ++面试,请确保此人了解指针。
通用的简单算法([单/双]链表)。问一下在每种情况下添加的复杂性(从一开始,到最后,优化...)?
(常规)如何仅通过3 * N / 2个比较从数组(N个大小)中找到最小值和最大值?
C / C ++:如何优化一个缓冲区的多个" strcat"?
欧拉计划中的任何早期版本都可能是不错的选择。
例如:
Problem 25 The Fibonacci sequence is defined by the recurrence relation: Fn = Fn?1 + Fn?2, where F1 = 1 and F2 = 1. Hence the first 12 terms will be: F1 = 1 F2 = 1 F3 = 2 F4 = 3 F5 = 5 F6 = 8 F7 = 13 F8 = 21 F9 = 34 F10 = 55 F11 = 89 F12 = 144 The 12th term, F12, is the first term to contain three digits. What is the index of the first term in the Fibonacci sequence to contain 1000 digits?
也许这不能直接回答问题,但是我不确定我们是否需要提出另一个问题。除了"容易记住"之外,FizzBuzz问题也很简单"容易",这就是重点。如果我们要采访的人属于FizzBuzz是"知名"的人群,那么他们属于FizzBuzz类型的问题不会被过滤掉的人群。这并不意味着我们就地聘用了他们,而是意味着他们应该能够轻而易举地接受采访。
换句话说,任何花时间阅读《恐怖编码》的人都值得进一步采访。只是让他们迅速地写出解决方案,简短地讨论一下(例如,我们如何测试?),然后继续下一个问题。正如文章所说,"真正令人惊讶的是,有多少候选人没有能力完成最简单的编程任务。"
我已经要求我的候选人创建一个程序,以他们选择的任何伪语言来计算给定数字的阶乘。这是一个相当容易解决的问题,非常适合于有关递归的自然跟进要求(经常会被问到)。
我想要一个不涉及模运算符的FizzBuzz问题。尤其是因为我通常会采访那些不经常使用模运算符的Web开发人员。而且,如果这不是我们经常遇到的问题,那么它就是我们需要几次查找这些问题之一。
(当然,这是一个概念,理想情况下,我们应该在数学课程中的某个地方遇到过这个概念,但这是一个不同的主题。)
因此,我想出的就是我所谓的"倒数第三"。指令是:
Write a program that prints out, in reverse order, every multiple of 3 between 1 and 200.
以正常顺序进行操作很容易:将循环索引乘以3,直到达到超过200的数字,然后退出。我们不必担心会终止多少次迭代,只需继续操作,直到达到第一个太高的值。
但是倒退,我们必须知道从哪里开始。有些人可能会直观地意识到198(3 * 66)是3的最高倍,因此,将66硬编码到循环中。其他人可能会使用数学运算(整数除法或者浮点数分别为200和3的floor())来计算该数字,并在此过程中提供更通用的方法。
从本质上讲,这与FizzBuzz属于同一类问题(循环遍历值并将其打印出来)。这是一个要解决的问题,它不使用(相对)深于模运算的东西。
对于可以在10秒钟内完成但确实真正超简单的操作,却会删除那些根本无法编程的人,请尝试以下方法:
Ask: show me (on paper, but better on a whiteboard) how you would swap the values of two variables.
这不是我的主意,而是在一个有关原始FizzBuzz问题的博客文章中,一个名叫Jacob的人的评论中发布的。
雅各布接着说:
If they don’t start with creating a third variable, you can pretty much write that person off. I’ve found that I can cut a third to half my (admittedly at that point unscreened) applicants with that question alone.
在原始博客文章的评论之后,还有进一步的有趣讨论,内容涉及在不需要第三个变量(加/减,xor等)的情况下执行此变量交换的方法,当然,如果我们使用的语言支持此功能,在单个语句/操作中,这可能不是一个很好的测试。
尽管不是我的主意,但我想在此发布此问题,因为这是一个非常优雅,简单的问题,即使编写了最简单的程序,也可以(并且应该)在大约10秒钟内回答。它也不需要使用像模运算符这样的表面上晦涩难懂的运算符,很多人本来就是相当好的程序员,但他们根本不熟悉(我从我自己的经验中知道)。