it-swarm.cn

您最喜欢的白板面试问题是什么?

正如标题所述,您最喜欢的白板面试问题是什么,为什么对您有效?

初级,高级,Java,C,Javascript,PHP,SQL,伪代码等.

52
Nicole

我要求应聘者在日常工作中设计我实际遇到的问题的解决方案。这样做,我尝试在我和候选人之间建立对话。我试图讨论他正在设计的设计,好像我以前从未考虑过这个问题一样。

我试图评估的是我们是否能够相互理解,以及我们是否可以在不混淆的情况下谈论技术问题。

具体例子

(对于Java桌面开发人员)

设计一个API来处理Web浏览器的导航历史记录(上一页,下一页,列出前10页),并且可以在应用程序的许多部分中重复使用(这里我给出具体示例)在我们的应用中)。然后,草拟一个实现。

我喜欢这个,因为它很简单,很容易说明,可以逐步解决(添加其他行为而不破坏所有内容),它可以讨论Edge的情况和错误处理,还可以讨论数据结构。

22
barjak

在采访候选人并筛选出没有业务的候选人时,我发现这一点很有启发性。它的复杂度与Fizz Buzz相似,但侧重于数据库技能。

Assuming the following basic  table structure
Documents (DocID, DocDate)
Keywords (KeyWordID, KeyWord)
DocumentKeywords (DocID,KeywordID)

Write a query to return the following:
Part 1: Documents with a DocDate after 4/1/1995  
Part 2: Documents that contain the keyword "Blue"  
Part 3: Documents that contain the either the keyword "Blue" or "Yellow"
Part 4: Documents that contain the both the keywords "Blue" and "Yellow"

我让他们用他们想要的任何SQL变体来编写它,并且在较小的语法问题上也不太挑剔。我主要想知道他们了解基本的关系数据库概念。

大多数候选人可以顺利通过第3部分,完全没有问题。您会惊讶于有很多人认为第4部分的答案仅仅是将运算符从OR)更改为where子句中的AND。

40
JohnFx

“在白板上为我绘制了上一个项目的设计,而没有向我透露任何敏感的细节。”

20
Uberto

实现strcpystrcmp和朋友。

14
fredoverflow

我最喜欢的涉及几门学科的是,给定接口(在C#中),计算二进制树中的节点数:

public interface IBinaryTree<T>
{
    IBinaryTree<T> Left
    {
        get;
    }

    IBinaryTree<T> Right
    {
        get;
    }

    T Data
    {
        get;
    }

    // Other properties and methods not germane to this problem.
}

只是为了好玩,这是实现方式,尽管受访者不必看到这一点。

public sealed class BinaryTree<T> : IBinaryTree<T>
{
    private readonly IBinaryTree<T> left;

    private readonly IBinaryTree<T> right;

    private readonly T data;

    public BinaryTree(
        IBinaryTree<T> left,
        IBinaryTree<T> right,
        T data)
    {
        this.left = left;
        this.right = right;
        this.data = data;
    }

    public IBinaryTree<T> Left
    {
        get
        {
            return this.left;
        }
    }

    public IBinaryTree<T> Right
    {
        get
        {
            return this.right;
        }
    }

    public T Data
    {
        get
        {
            return this.data;
        }
    }

    // Other properties and methods not germane to this problem.
}

和助手班:

public static class BinaryTreeNodeCounter
{
    public static int CountNodes<T>(this IBinaryTree<T> tree)
    {
        // TODO: What goes here?
    }
}

我喜欢看到的解决方案是这样的:

public static class BinaryTreeNodeCounter
{
    public static int CountNodes<T>(this IBinaryTree<T> tree)
    {
        return tree == null
            ? 0
            : 1 + tree.Left.CountNodes() + tree.Right.CountNodes();
    }
}

由于它显示了以下知识:

  • 一棵树(特别是二叉树)如何工作
  • 二叉树的递归定义
  • 递归方法以及基本案例如何阻止递归
  • 计算单个节点意味着什么
  • 作为合同接口
  • (不太重要)有关C#语法的知识:
    • 仿制药
    • 扩展方法
    • 三元运算符
14
Jesse C. Slicer

为我引发了有趣的白板讨论的两个问题是

  1. “请您尽可能详细地解释网络浏览器如何获取生成的页面”
  2. “请解释Java Hibernate的工作原理”

他们从简单开始,然后逐渐变得复杂。

12
Gary Rowe

我不喜欢将拼图或设计问题用作白板问题。我更喜欢简单,简单的问题,这些问题可以测试应聘者编写某些代码的能力。我的最爱是:

1)编写一个函数以反转单链表。 (他们花了一段时间才意识到他们需要3个指针。)

2)给定二叉树,找到二叉树的深度。 (这个问题测试了他们编写递归代码的能力。让我检查一下它们的基本情况是否完好。)

3)编写一个用于对整数数组进行二进制搜索的过程。 (就像乔恩·本特利(Jon Bentley在《 Programming Pearls》中说的那样),许多人在编写二进制搜索时往往会犯错误。然后人们可以继续进行查找错误,编写测试用例,遍历代码等。)

8
pyNem

我们曾在一家公司工作过。

我们递给了候选人一张用于追踪时间的纸。这是一个或我们的部门使用的真实时间表。我们要求应聘者引导我们完成设计过程,以创建更好的时间跟踪工具。没有界限,没有说什么语言等等,只是想看看候选人在“整个生命周期”中的表现如何。它使我们对他们如何收集需求有了真正的了解。他们如何构造数据库表,它们可以做什么UI。这项任务显然需要沟通技巧。通常是在一个有几个大白板的房间里进行的,持续时间长达2个小时。

我们雇用了几个使用此过程的人员,如果他们在任务上做得很好,对我们来说真的做得很好。如果他们是边缘人,而我们还是决定雇用他们(单独的话题),那么他们就是边缘程序员。

7
Bill Leeper

我使用了与我的编程领域有关的问题。

例如,如果我开发Web应用程序,我想看看他们如何编写一个删除记录的Web表单,以及他们将采取什么方法从数据库中删除记录。这告诉我他们是否了解基本数据库原理,如何与用户交互以验证删除,以及他们是否知道软删除。

我没有最爱。我选择的问题将因工作而异。

我不在乎他们是否可以在面试中完全解决问题,他们使用什么技术和语言,或者他们的代码在白板上看起来多么糟糕。我正在寻找一种思维模式;我想看看他们是否知道如何思考和解决问题。

6
Robert Harvey

我最喜欢的是我的一个朋友。

给我写一个函数来生成/打印/存储第一个“ n”素数,然后解释它的工作方式和效率。

之所以有效,是因为:

  1. 这是一个算法问题,因此要求受访者能够思考然后解释他们的想法-这样您才能了解他们的大脑如何工作。

  2. 它是独立于语言的。

  3. 几乎没有人能完全正确地做到这一点(通常会漏掉一个Edge盒(通常是1或2个),或者他们不处理负数,因此您可以了解他们如何处理错误并被告知错误。

  4. 大多数操作都是通过简单但非常缓慢的筛子来完成的(例如,有80%的人会通过将n除以小于n的所有整数来检查n是否为质数),这为您提供了很多关于如何改进基于算法的讨论的空间时空权衡“如果您已经知道不能将数字除以2,那么为什么要用数字除以4?”或“您已经得出结论,您只需要除以小于sqrt(n)的所有素数,但这需要您将这些数存储在某个地方,这意味着什么?”

他们不需要正确的答案。如果有人可以思考和解释他们的想法,那么他们成为优秀候选人的路途还很遥远。

4
Rhys Gibson

这实际上取决于您要寻找的内容,作为一个组织,它从事涉及图像的大量动态Web工作,因此我倾向于询问与工作相关的几何问题。无论如何,我倾向于问一个几何问题,因为我发现它是一个很好的数学测试,既美观又直观,并且可以显示候选人以视觉方式展示他们的工作并有条理地解决问题的能力。

对于高级候选人,我偶尔会提出以下问题:

此图像显示新月。从B到D的月牙宽度为9厘米,在E和F之间为5厘米。 C是大圆圈的中心。

a)请计算月牙面积。 Crescent Moon Maths Question

b)描述必要的计算,以调整图像的大小以适合任何给定尺寸的内圆,如果已知中心点,则将其放置在圆内。

对于一个更简单的问题,我通常会给出相同类型的问题,但是使用“正方形内的圆圈内的正方形”示例。虽然这很容易,但是我希望在它上面有完美的代数。

Square inside a circle inside a square

除此之外,我倾向于要求他们敲定一种算法,以生成可变长度数据集的所有组合。

3
Orbling

我见过的最好的FizzBu​​zz答案是:

SQL Server 2008年

;WITH mil AS (
 SELECT TOP 100 ROW_NUMBER() OVER ( ORDER BY c.column_id ) [n]
 FROM master.sys.all_columns as c
 CROSS JOIN master.sys.all_columns as c2
)                
 SELECT CASE WHEN n  % 3 = 0 THEN
             CASE WHEN n  % 5 = 0 THEN 'FizzBuzz' ELSE 'Fizz' END
        WHEN n % 5 = 0 THEN 'Buzz'
        ELSE CAST(n AS char(6))
     END + CHAR(13)
 FROM mil

C#(简单)

foreach (int number in Enumerable.Range(1, 100))
{
    bool isDivisibleBy3 = (number % 3) == 0;
    bool isDivisibleBy5 = (number % 5) == 0;

    if (isDivisibleBy3)
         Console.Write("Fizz");

    if (isDivisibleBy5)
         Console.Write("Buzz");

    if (!isDivisibleBy3 && !isDivisibleBy5)
         Console.Write(number);

    Console.WriteLine();
}

C#(聪明)

 Enumerable
  .Range(1, 100)
  .Select(i =>
    i % 15 == 0 ? "FizzBuzz" :
    i % 5 == 0 ? "Buzz" :
    i % 3 == 0 ? "Fizz" :
    i.ToString())
  .ToList()
  .ForEach(s => Console.WriteLine(s));
3
Simon Hughes

叫做aff_z的东西,它是我的工科学校C考试的一部分,被用作“假”测试,目的是让学生在节假日回来时不及格(我们的评分系统暗示,如果考试不及格,就会停止评分,因此,如果不通过模拟考试,会使您的整个测试无效。迫使您注意音韵细节。我在面试中确实重复了一两次。

无论如何...我忘记了确切的表述,但是就是这样...

Write a function taking a single char parameter named c and returning nothing (void).
You function must satisfy the following requirements:

 - if c is bigger or equal to 0, then print 'z' to standard output
 - if c is stricly smaller than 0 , then print 'z' to standard output
 - in any other case, print the letter 'z' to standard output

可悲的是,当答案相当明显时,不仅有些学生会提出极为复杂的解决方案,而且有些学生甚至会失败。

信不信由你,它的确在面试中也发生过。

在面试中运行它很有趣,因为有些申请人会开始写可能的分支,然后意识到出了什么问题(很显然,如果您只是口头询问他们,那么在您讲话时这样做也是可以理解的……但是如果您以书面形式给我,我觉得很困惑...)

这很愚蠢,但是我想这是一个极简主义的筛选(类似地,在雇用JS程序员时,我总是问如何声明一个变量,然后根据他们的回答,是否使用var根本没有任何区别。这通常是一个令人难过的时刻,老实说。)

3
haylem

我在面试的候选人中寻找一些东西。由于我无法在线描述的原因,我们得到了相当差的候选人,而且我已经开始期待它了,所以我对他们很容易。即使如此,我仍在寻找:

  • 设计意识。

    “为我显示一个通讯录程序的表结构,该程序具有带有名字和姓氏的联系人,可以具有多个电话号码,并带有号码说明(单元格/家庭/工作/等)。”

    我不是在这里寻找UML 2.0规格图,这里有一个简单的气泡图就可以了。只要是合理的。

  • 具有使用数据库的知识(即SQL)

    1. 编写查询以获取姓氏为“ smith”的人的所有电话号码
    2. 编写查询以获取数据库中的所有客户,以及姓氏为“ smith”的客户的电话号码
  • 测试知识

    假设存在带有签名public IEnumerable<PhoneNumber> GetPhoneNumbers(string lastName)的方法,该方法返回先前的查询结果。假定如果将null传递给方法,则它将引发NullReferenceException。编写测试以演示此功能。

    编写一个测试来证明GetPhoneNumbers将为姓氏“ smith”的人返回家庭电话号码(123)456-7890。

  • 了解如何编写一些代码

    实现一种满足您编写的测试要求的方法。


考虑到我们获得的申请人数量和质量,我采访了所有认真申请过的人。我没有雇人。

2
Steven Evers

为以下问题编写算法:给出一个数字n,输出具有n个节点的(唯一)二叉树的总数。

因此,对于n= 0和n= 1,答案为1。对于n= 2,您拥有2:根节点,然后第二个节点在左边或右边。

您可以深入了解设计技术,并了解他们是否想到了递归或记忆或动态编程解决方案。

(有关二进制搜索树的相关但不同的情况,另请参见此StackOverflow 讨论 。)

2
Macneil

如果要采访软件开发人员,我会请他设计软件并描述硬件要求,以从任意大的文件(每行包含全名)中删除重复的条目。我故意使问题描述的某些部分含糊不清。然后,我向他提出挑战,看看他是否了解分析和澄清需求,不同的权衡,数据结构和算法,I/O(辅助存储),软件和硬件技术,可伸缩性等。

我认为这是一个小而具有挑战性的问题,它揭示了申请人在许多计算领域的知识和能力。

2
Ebrahim Mohammadi

我最喜欢的C++白板问题是拥有候选工具

Vector3 a(1, 0, 0), b(0, 1, 0); // Mathematical 3D vectors
double c = 7.0;
double d = a * c;
Vector3 e = a * b;

由此我可以学习

  • 如果考生认识到您不能在返回类型上超载(表示初级C++)
  • 如果候选人知道如何返回一个临时变量并实​​现强制转换运算符(表示中级C++)
  • 候选人是否可以进行基本的向量数学运算(对于我们的应用领域很重要)
2
smithco

Implement function/method(on c/c++/c# whatever), which calculates n-th item of Fibonacci sequence

许多人可能会坚持下去。如果给出一些解决方案-通常使用递归。之后:

Implement the same via 'for'-loop

不能告诉你,有多少同胞未能完成两项任务-50%的应聘者。
这就是为什么我喜欢它:)

2
alexb

对于数据库,我使用:

表格:Things 
 
 ID名称
 1 Bodkin Van Horn 
 2 Hoos-Foos 
 3 Hoos-Foos 
 4 Hot- Shot 
 5 Marvin O'Gravel气球面
 6 Snimm 
 7 Marvin O'Gravel气球面
 8 Marvin O'Gravel气球面
 9戴夫

给我写一些SQL,该SQL将根据名称对像这样的表进行重复数据删除(我不在乎我返回哪个ID,但是无论返回哪个ID都必须对该名称有效)。因此,将正确的SQL应用于该表后,该表将显示如下内容:

表格:事物
 
 ID名称
 1 Bodkin Van Horn 
 2 Hoos-Foos 
 4 Hot-Shot 
 5 Marvin O '砾石气球脸
 6妮妮
 9戴夫

我喜欢它因为:

  • 重复数据删除是一个现实问题
  • 有很多方法可以做到这一点
  • 我认为几乎所有这些方法都需要您要么(稍微)理解更复杂的SQL(本质上是GROUP BY和HAVING),要么需要通过链接多个更简单的语句进行推理的能力。
  • 由于这最后一点,即使他们在语法或其他方面苦苦挣扎,您也可以问他们在想什么,然后以这种方式进行交谈。
  • 它引用了苏斯博士

(在这里,我发现这样做有一些完全不重要的方法,这些年来,我一直在使它复杂化)。

2
Jon Hopkins

我通常让他们勾画出他们所使用的最后一个系统的框图,询问这些模块之间的关系,然后让他们详细说明他们正在/负责的模块。您可以从这项练习中学到很多东西,例如一个人如何超越自己的小领域,知道他在做什么,对他有多重要,还可以了解他扮演的角色,无论是关键还是侧面角色。

2
Assimiz

您将如何代表标准的52卡座?任何编程语言都可以。您将如何洗牌?

2
MrDatabase

您有一个盛有200条鱼的碗。在这些鱼中,有99%不是孔雀鱼。您应该去除多少鱼,以便剩下的2%是孔雀鱼。展示你的作品。

这是关于混乱的要求。据说这种方法可以在同一问题中多次更改视角。旨在查看他们是否可以弄清楚到底发生了什么。

会有很多人弄错了,您会感到惊讶。

1
dacracot

自从我开始使用它以来,我一直在使用的一个问题是:

编写函数以打印1到100之间的所有数字。

我一直使用它的很大一部分原因是您可以采取解决方案并朝各个方向移动:

您将如何修改该功能以打印1到1000、10000或n之间的所有数字?

他们对这些问题的回答可以使您了解他们如何响应不断变化的需求以及他们是否可以识别性能方面的考虑。一个强大的候选人可能会回答一个问题,即该功能被调用的频率需要什么。

朝着不同的方向前进:

如果您知道此功能每分钟将被调用几次且性能令人担忧,您将如何改变?

我将其用作检查其横向思维的一种方式。由于最大值会变大,因此素数的计算可能会变慢,因此有时仅使用根据您要解决的问题进行调整的某种已计算或预先计算的查找表就更有意义。

1
rjzii

这是引发一些思考的一种方法-简单明了,涉及一些数学,并检查候选人对基本计算机设计的了解(溢出,数字表示等):

编写一个以一对整数X,Y作为输入并确定X * Y是否能被10整除的程序(或过程)。重要说明:X和Y可能足够大,以致X * Y溢出了可用的最大整数类型在您的机器上。



T_BOOL MultipleOfTen(int x, int y)
{
    return((x%2==0 || y%2==0) && (x%5==0 || y%5==0));
}
1
oosterwal

我最喜欢的是从询问printf的原型开始。然后给定一个低级API printc(char c),它将打印一个字符,实现printf。给出各种有趣的响应,例如堆栈是CPU的一部分。您可能已经猜到我来自C语言和嵌入式背景。

1
aufather

我有几个收藏夹,但这里几乎总是有几个。在大多数时候,我都在进行最后一轮技术(C++)面试,所以我倾向于更长和更开放的问题,这些问题会引起新的兴趣领域。没有“正确”的答案,只是其他对话的开端。

1)实施基本的共享指针,解释在实现中与tr1或boost的共享指针相比存在哪些不足,应如何使用等。

2)代码审查。对于有经验的员工,我们希望他们能够放心地审查一些提供的代码,以解决设计问题,错误,代码恐怖和潜在的可维护性问题。另外,当然,他们会如何解决它;有时他们会如何将这些信息传达给他们被击倒的初级开发人员。

1
Alaric

填写以下方法:[〜#〜] ps [〜#〜]数字的模式是出现次数最多的数字(在列表中)。

public int getMode(List<Integer> numberList) {


}

这是为了看到有效的代码。

0
Buhake Sindi