我认为存在一些简单的问题,例如嗡嗡声,倒转字符串等,然后是某些问题,而如果您之前没有看过,那么很难获得预期的最佳解决方案,而且还要增加面试的压力和较短的时间约束。最糟糕的是,有时没有技术知识的招聘人员会问其中一些问题,他们正在寻找非常具体的答案。...如果您没有给出最佳答案,他们会认为您是绝对的白痴。即使您的答案有效,也可以解决问题,尽管它可能不是最佳选择,但它的效率也不会太低。
一些示例:
您将如何洗牌?他们正在寻找Fisher-Yates方法http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle其他答案是“错误的” ...除非您想先洗牌并专门查一下,否则您可能不会知道。在做答案的过程中,您可能会偶然发现它,但是据我所见,他们希望您知道这种寒冷,因此怀疑是否会有大量时间允许找到解决方案。另一种效率较低(但可能更明显)的方法是创建一个新数组,该数组具有指向原始数组的指针和一个为随机数的数字,然后按随机数对数组进行排序。然后使用排序后的数组构造新的纸牌数组。无论如何,我将其介绍给招聘人员都会得到0分。
另一个示例是关于如何在从1到n-1的n个数字的列表中检测重复数字的问题。显而易见的答案(从时间角度来看这是相对有效的)是使用哈希表插入每个元素,如果发现已经插入的元素,则找到重复的元素。最佳答案是因为如果没有重复数,则数字在1到n之间,则可以得到期望的总和为n(n + 1)/ n。然后,如果对数组求和,则得到的实际和要小于期望的和。所以基本上n-(预期总和-实际总和)=重复的数字...这是一个非常特殊的情况...我还好...
另一种方法是,反转字符串中的所有单词,而无需使用任何其他空格。我不得不考虑一下,招聘人员在我认为的5分钟内非常不耐烦(以相反的方式拆分并重新加入字符串,或者将单词逐字排列成一个新数组都非常容易)。我想出了最后一个单词的边界,找到了第一个单词的结尾,然后将整个列表不断下移1,然后插入适当的字母。然后重复直到您到达列表的末尾。这种方法行之有效,并且访调员同意(他有点技术),但是效率很低。当我回到家时,我搜索了最佳答案,那就是反转列表,然后反转每个单词。有些人可能会想到这一点,
现在,一旦您看到其中一些问题,您就可以轻松解决它们,这是事实。因为有些相似的问题也有一些相同的技巧。我特别知道n(n-1)/ 2公式和数字列表有几个变体。但是我仍然不知道这些问题在考什么。FizzBuzz是每个人都应该能够做的事情(尽管我看到的变化并不是那么简单,在这种情况下,我开始质疑,即使在没有键入/调试代码的情况下,这对于面试情况来说是否也是现实的)。这些问题中的一些一旦您看到就显而易见,但是如果您没有看到它们,那么它们就不那么明显了。所有人都说过,二进制搜索的第一个正确实现要花好几年的时间...现在二进制搜索是如此明显,因为每个人都可以读懂它。
尽管如此,我认为最糟糕的是非技术人员因为无法欣赏您的解决方案而提出的问题是正确的,尽管不是最优的。他们只知道您的解决方案不是所提出的,因此这是完全错误的,您对此尝试一无所获。甚至非最佳解决方案也常常显示出编程构造方面的知识。除非我正在编写扑克游戏,否则我不在乎有人能洗牌多好。即使是我,在向他们展示了高效的算法之后,我敢肯定,半途而废的人都可以遵循它。
模板问题似乎只会给面试时间更长的候选人带来好处,因为他们更有可能看到更多的模板问题。即使是FizzBuzz,第一次看到它时,您可能也会感到恐惧,但是随着您一遍又一遍地看到它,您会变得越来越习惯。您可能要做的最好的事情是提出一些需要自定义业务逻辑的编码挑战。例如,创建一些数据集(对象/记录的数组),然后创建一些业务规则以应用于每个对象并返回答案。例如:某种类型的评分等,但是非常自定义的规则)。尽管他们可能已经遍历记录并应用了无数次逻辑,但是您的规则将是唯一的,因此至少他们必须理解并成功实现您创建的规则。
假设预计的薪水,候选人名单以及他们最喜欢的3个视频游戏,也许还有起薪。喜欢Zelda的候选人将受到300点罚款,喜欢小美人鱼的候选人将获得200点奖金。喜欢大金刚和超级马里奥兄弟但不喜欢马里奥博士的候选人可获得300奖金。喜欢Metroid或Kid Icarus的候选人可以获得200奖金,等等。。。似乎有些疯狂,但是它向您展示了他们将业务规则转换为逻辑程序构造并测试其对布尔逻辑的理解的能力。总体上与fizzbuzz的区别不大,只是不使用模数和循环。您当然可以给他们列表,让他们循环浏览,并使用特定的输出条件将结果打印到屏幕上。