算法/数据结构设计面试问题

时间:2008-09-12 05:17:35

标签: algorithm data-structures

您在候选人筛选过程中发现哪些简单的算法或数据结构相关的“白色登机”问题?

我有一些简单的用于验证解决问题的技巧,可以简单地表达,但是有一些机会可以应用一些启发式方法。

我用于初级开发人员的基础之一是:

  

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

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

您采访的白板问题有哪些,以及您在答案中寻找的内容(不需要发布实际答案)。

11 个答案:

答案 0 :(得分:24)

有一次,当我在大学面试微软时,那个人问我如何检测链表中的循环。

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

他告诉我,“不,不,每个人都给了我解决方案。再给我一个。”

我认为我的解决方案是最佳的。他说,“我知道这是最优的。给我一个次优的。”

与此同时,这是一个非常好的问题。

答案 1 :(得分:23)

我喜欢经典的“LinkedList和ArrayList之间的区别(或链接列表和数组/向量之间的区别)以及为什么要选择其中一个?”

我希望的答案包括讨论:

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

答案 2 :(得分:16)

最近采访时,我经常被要求实现一个数据结构,通常是LinkedList或HashMap。这两个都很容易在短时间内完成,并且很难消除无能为力。

答案 3 :(得分:10)

这并不一定涉及OOP功能,但在我们上一组访谈中,我们使用了Bug of the Month列表中的一些错误代码。观察候选人发现错误显示他们的分析能力,显示知道如何解释别人的代码

答案 4 :(得分:9)

  1. 编写一个接受字符串的方法,如果该字符串是数字,则返回true。(任何正则表达式作为面试最有效的答案)
  2. 请编写一个抽象工厂方法,该方法不包含开关并返回基类型为“X”的类型。 (寻找模式,寻找反思,寻找他们不要一步,并使用if if if)
  3. 请将字符串“every; thing |; | else |; | in |; | he; re”拆分为“|; |”。(至少在.net中不允许使用多字符标记,所以查找对于创造力,最好的解决方案是完全破解)

答案 5 :(得分:7)

图形很难处理,因为如果需要的不仅仅是算法草图,那么大多数非平凡的图形问题往往需要实现相当数量的实际代码。很多问题往往归结为候选人是否知道最短路径和图遍历算法,熟悉周期类型和检测,以及他们是否知道复杂性界限。我认为关于这些东西的很多问题都归结为琐事,而不是现场的创造性思维能力。

我认为与树木相关的问题往往会涵盖图形问题的大部分困难,但代码复杂度却没有那么多。

我喜欢Project Euler问题,要求找到树下最昂贵的路径(16/67);共同的祖先是一个很好的热身,但很多人都看到了它。要求某人设计一个树类,执行遍历,然后找出他们可以重建树的遍历,也可以深入了解数据结构和算法实现。 Stern-Brocot编程挑战也很有趣,并且可以在板上快速开发(http://online-judge.uva.es/p/v100/10077.html)。

答案 6 :(得分:5)

跟进这样的问题:“你怎么能改进这个代码,以便维护它的开发人员可以弄清楚它是如何工作的?”

答案 7 :(得分:5)

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

答案 8 :(得分:4)

我喜欢查看该人实际编写的代码并让他们向我解释。

答案 9 :(得分:2)

一个微不足道的问题是让他们从头开始编码广度优先搜索树。是的,如果你知道你在做什么,这是微不足道的。但是很多程序员都不知道如何解决它。

我觉得更有用的一个如下。我用多种语言给出了这个,这是一个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各有100,000个元素需要进行多少比较。我寻找特定的术语,只是信封估计的后面。)< / LI>
  3. 没有代码,建议加快速度。 (如果他们提出一个易于编码的方向,我会要求他们编码。如果他们想到一个会导致@int以任何方式改变的解决方案(例如通常的订单),我会推动看到他们是否意识到他们不应该在检查是否重要之前对代码进行编码。)
  4. 如果他们提出了一个稍微(或非常)错误的解决方案,以下愚蠢的数据集会发现您遇到的大多数错误:

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

    我猜大约有2/3的候选人没有通过这个问题。我还没有遇到一个有能力的程序员。我发现那些具有良好常识和非常少的编程背景的人在这方面比具有几年经验的普通程序员做得更好。

    我建议将这些问题用作过滤器。不要雇人,因为他们可以回答这些问题。但如果他们不能回答这些问题,那就不要雇用他们了。

答案 10 :(得分:2)

要求他们为一个众所周知的迭代解决方案写一个递归算法(即Fibonacci等 - 我们给它们一个迭代函数,如果需要的话),然后让它们计算它的运行时间

很多时候,递归函数涉及树数据结构。这个人没有认识到这让我感到困惑的次数。计算运行时间变得有点困难,直到你看到它是一个树形结构......

我发现这个问题涉及很多方面。即,他们的代码读取能力(如果他们被赋予迭代功能),代码编写能力(因为他们编写递归函数),算法,数据结构(运行时)......