algorithm/数据结构devise面试问题

什么是一些简单的algorithm或数据结构相关的“白板”问题,你在候选人筛选过程中发现有效?

我有一些简单的,我用来validation解决问题的技巧,可以简单地expression,但有一些启发式应用的机会。

我用于初级开发人员的基本知识之一是:

编写一个C#方法,该方法接受一个包含一组单词(一个句子)的string,并将这些单词旋转X个右侧的位置。 当句子的最后一个单词被旋转时,它应该出现在结果string的前面。

当候选人回答这个问题,我看他们可以使用.NET数据结构和方法(string.Join,string.Split,List等等)来解决这个问题。 我也寻找他们来确定优化的特殊情况。 像单词需要旋转的次数不是真的X,它是X%的单词数量。

你用来面试候选人的一些白板问题是什么,以及你在答案中寻找什么东西(不需要发布实际答案)。

我喜欢经典的“LinkedList和ArrayList(或链接列表和数组/vector之间)有什么区别,为什么要select一个或另一个?

我希望的答案是包含以下内容的讨论:

  • 插入性能
  • 迭代性能
  • 内存分配/重新分配的影响
  • 删除从开始/中间/结束元素的影响
  • 如何知道(或不知道)列表的最大大小会影响决策

曾经当我在大学面试微软的时候,这个人问我如何在链表中检测一个循环。

在上周的课堂上讨论了问题的最佳解决scheme之后,我开始告诉他。

他告诉我:“不,不,每个人都给我这个解决办法,给我一个不同的办法。”

我认为我的解决scheme是最佳的。 他说:“我知道这是最理想的,给我一个次优的。”

同时,这是一个相当不错的问题。

最近面试时,经常要求我实现一个数据结构,通常是LinkedList或者HashMap。 这两个都很容易在短时间内实现,而且很难消除无知。

这不一定涉及面向对象的能力,但是在我们的最后一系列面试中,我们使用了“月错误”列表中的一些错误代码。 看候选人发现错误显示他们的分析能力,显示知道如何解释别人的代码

  1. 编写一个接受string的方法,如果该string是一个数字,则返回true(正则expression式作为面试的最有效答案)
  2. 请编写一个抽象工厂方法,它不包含开关,并返回基types为“X”的types。 (寻找模式,寻找反思,寻找他们不要旁边的步骤,并使用一个如果其他如果)
  3. 请分割string“every; thing |; | else |; | in |; | he; re”由标记“|; |”(多字符标记至less在.net中是不允许的,所以寻找创造力,最好的解决scheme是彻底的破解)

图很难,因为大多数非平凡的图问题往往需要大量的实际代码来实现,如果不仅仅需要一个algorithm的草图。 很多情况下,候选者是否知道最短path和图遍历algorithm,是否熟悉循环types和检测,以及是否知道复杂性界限。 我觉得很多关于这个东西的问题比现在的创造性思维能力更多的是琐事。

我认为与树相关的问题倾向于覆盖图问题的大部分困难,但没有太多的代码复杂性。

我喜欢欧拉问题,要求find最昂贵的path(16/67)。 共同的祖先是一个很好的热身,但很多人都看到了它。 要求某人devise一个树类,执行遍历,然后计算出哪些遍历可以重build树,也能够深入了解数据结构和algorithm实现。 Stern-Brocot编程挑战在董事会上也很有趣而且很快( http://online-judge.uva.es/p/v100/10077.html )。

我喜欢去看一个人写的代码,然后把它解释给我。

跟随任何这样的问题:“你怎么能改进这个代码,让维护它的开发者能够很容易地知道它是如何工作的?

实现一个函数,给定一个可能是循环的链表,交换前两个元素,第三个和第四个等…

一个微不足道的是要求他们从头开始对树的广度优先search。 是的,如果你知道你在做什么,这是微不足道的。 但是很多程序员不知道如何解决这个问题。

我觉得更有用的一个如下。 我已经用多种语言给出了这个,这是一个Perl版本。 首先我给他们下面的代码示例:

# @a and @b are two arrays which are already populated. my @int; OUTER: for my $x (@a) { for my $y (@b) { if ($x eq $y) { push @int, $x; next OUTER; } } } 

然后我问他们以下问题。 我慢慢地问他们,给人时间思考,并愿意给他们推动:

  1. 这段代码完成后,@int中是什么?
  2. 此代码已投入使用,并且存在一个跟踪此代码的性能问题。 解释潜在的性能问题。 (如果他们在挣扎,我会问,如果@a和@b每个都有10万个元素,我会问这个比较需要多less,我不是在寻找特定的术语,而只是在信封估计的后面。
  3. 没有代码,build议让这个更快。 (如果他们提出一个易于编码的方向,我会要求他们编码,如果他们想到一个解决scheme,会导致@int以任何方式被改变(例如通常的顺序),我会推动看到他们是否意识到,在检查是否重要之前,他们不应该编码。)

如果他们提出了一个(或者是非常)错误的解决scheme,那么下面这个愚蠢的数据集就会发现你遇到的大多数错误:

 @a = qw( hello world hello goodbye earthlings ); @b = qw( earthlings say hello earthlings ); 

我猜想大约三分之二的候选人不能解决这个问题。 我还没有遇到一个有能力的程序员。 我发现,具有良好的常识和很less的编程背景的人比那些具有几年经验的普通程序员更好。

我会build议使用这些问题作为filter。 不要雇人,因为他们可以回答这些问题。 但是,如果他们不能回答这些问题,那就不要雇用他们。

要求他们为一个众所周知的迭代解决scheme(即斐波纳契等)写一个recursionalgorithm – 如果需要,我们给它们一个迭代函数),然后让它们计算它的运行时间。

recursion函数多次涉及到树形数据结构。 这个人没有认出这个数字让我感到困惑。 计算运行时间变得稍微困难​​一些,直到你看到它是一个树形结构。

我发现这个问题涉及很多领域。 也就是说,他们的代码阅读能力(如果他们被赋予一个迭代函数),代码写入能力(因为他们写recursion函数),algorithm,数据结构(运行时)…