就像标题中所说的,您最喜欢的白板面试问题是什么,为什么对您有效?
初级,高级,Java,C,Javascript,PHP,SQL,伪代码等
就像标题中所说的,您最喜欢的白板面试问题是什么,为什么对您有效?
初级,高级,Java,C,Javascript,PHP,SQL,伪代码等
Answers:
我要求应聘者设计解决方案,以解决我在日常工作中实际遇到的问题。这样做,我尝试在我和候选人之间建立对话。我尝试讨论他正在构建的设计,好像我以前从未考虑过该问题一样。
我试图评估的是我们是否能够相互理解,以及我们是否可以在不混淆的情况下谈论技术问题。
(对于Java桌面开发人员)
设计一个API来处理Web浏览器的导航历史记录(上一页,下一页,列出前10个页面),并且可以在应用程序的许多部分中重复使用(这里我在我们的应用程序中提供了具体示例)。然后,草拟一个实现。
我喜欢这个,因为它很简单,很容易说明,可以逐步解决(添加其他行为而不破坏所有内容),它可以谈论边缘情况和错误处理,还可以谈论数据结构。
在采访候选人并筛选出没有业务的候选人时,我发现这一点很有启发性。它的复杂度与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部分的答案只是要将where子句中的运算符从OR更改为AND。
“在白板上为我绘制了上一个项目的设计,而没有向我透露任何敏感的细节。”
实施strcpy
,strcmp
和朋友。
atoi()
。
strdup()
。
strrev()
或反转字符串功能。我的白板解决方案给他们留下了深刻的印象,我现在正在工作。
我最喜欢的涉及几门学科的是,给定接口(在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();
}
}
因为它说明了以下方面的知识:
为我引发了有趣的白板讨论的两个问题是
他们从简单开始,然后逐渐变得复杂。
我不喜欢将拼图或设计问题用作白板问题。我更喜欢简单,简单的问题,这些问题可以测试应聘者编写某些代码的能力。我的最爱是:
1)编写一个函数以反转单链表。(他们花了一段时间才意识到他们需要3个指针。)
2)给定二叉树,找到二叉树的深度。(此问题测试了他们编写递归代码的能力。让我检查一下它们的基本情况是否完整。)
3)编写一个用于对整数数组进行二进制搜索的过程。(就像乔恩·本特利(Jon Bentley在《 Programming Pearls》中说的那样),许多人在编写二进制搜索时往往会犯错误。然后人们可以继续进行查找错误,编写测试用例,遍历代码等。)
我们曾在一家公司工作过。
我们递给了候选人一张用于追踪时间的纸。这是一个或我们的部门使用的真实时间表。我们要求应聘者引导我们完成设计过程,以创建更好的时间跟踪工具。没有界限,没有说什么语言等等,只是想看看候选人在“整个生命周期”中的表现如何。它使我们对他们如何收集需求有了真正的了解。他们如何构造数据库表,它们可以做什么UI。这项任务显然需要沟通技巧。通常是在一个有几个大白板的房间里进行的,持续时间长达2个小时。
我们雇用了几个人使用此过程,如果他们在任务上做得很好,对我们来说真的做得很好。如果他们是边缘人,我们还是决定雇用他们(单独的话题),那么他们就是边缘程序员。
我使用了与我的编程领域有关的问题。
例如,如果我开发Web应用程序,我想看看他们如何编写一个删除记录的Web表单,以及他们将采取什么方法从数据库中删除记录。这告诉我他们是否了解基本数据库原理,如何与用户交互以验证删除,以及他们是否知道软删除。
我没有最爱。我选择的问题将因工作而异。
我不在乎他们是否可以在面试中完全解决问题,他们使用什么技术和语言,或者他们的代码在白板上看起来多么糟糕。我正在寻找一种思维模式;我想看看他们是否知道如何思考和解决问题。
我最喜欢的是我的一个朋友。
给我写一个函数来生成/打印/存储第一个“ n”素数,然后解释它的工作方式和效率。
之所以有效,是因为:
这是一个算法问题,因此要求受访者能够思考然后解释他们的想法-这样您才能了解他们的大脑如何工作。
它是独立于语言的。
几乎没有人能完全正确地解决问题(通常会漏掉一个极端情况(通常是1或2个),或者他们不处理负数,因此您可以了解他们如何处理错误并被告知错误。
大多数操作都是通过简单但非常缓慢的筛子来完成的(例如,有80%的人会通过将n除以小于n的所有整数来检查n是否为质数),这为您提供了很多关于如何改进基于算法的讨论的空间关于空间/时间的权衡取舍,例如“如果您已经知道数字不能被2整除,为什么还要将数字除以4?” 或“您已经得出结论,您只需要除以小于sqrt(n)的所有素数,但这需要您将这些数存储在某个地方,这意味着什么?”
他们不需要正确的答案。如果有人可以思考和解释自己的想法,那么他们成为优秀候选人的路途还很遥远。
叫做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根本没有任何区别。这通常是一个令人难过的时刻,老实说。)
variablename = variablevalue;
” 使面试答案不及格,而优秀的候选人只是在电话里或当面大笑,直接告诉我,选择或不选择会有什么不同var
)。
这实际上取决于您要寻找的内容,因为一个组织要进行涉及图像的大量动态Web工作,所以我倾向于询问与工作相关的几何问题。无论如何,我倾向于问一个几何问题,因为我发现它是一个很好的,直观的数学测试,可以显示应聘者以视觉方式展示他们的工作并有条理地解决问题的能力。
对于高级候选人,我偶尔会提出以下问题:
此图像显示新月。从B到D的月牙宽度为9厘米,在E和F之间为5厘米。C是大圆圈的中心。
a)请计算月牙面积。
b)描述必要的计算,以调整图像的大小以适合任何给定尺寸的内圆,如果已知中心点,则将其放置在圆内。
对于一个更简单的问题,我通常会给出相同类型的问题,但是使用“正方形内的圆圈内的正方形”示例。尽管这很容易,但是我希望在它上面有完美的代数。
除此之外,我倾向于要求他们敲定一种算法,以生成可变长度数据集的所有组合。
我见过的最好的FizzBuzz答案是:
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));
我在面试的候选人中寻找一些东西。由于我无法在线描述的原因,我们得到了相当差的候选人,而且我已经开始期待它了,所以我对他们很容易。即使如此,我仍在寻找:
设计意识。
“为我显示一个通讯录程序的表结构,该程序具有带有名字和姓氏的联系人,可以具有多个电话号码,并带有号码说明(单元格/家庭/工作/等)。”
我不是在这里寻找UML 2.0规格图,这里有一个简单的气泡图就可以了。只要是合理的。
具有使用数据库的知识(即SQL)
测试知识
假设public IEnumerable<PhoneNumber> GetPhoneNumbers(string lastName)
存在带有签名的方法,该方法返回先前的查询结果。假定如果将null传递给方法,则它将引发NullReferenceException。编写测试以演示此功能。
编写一个测试,以证明GetPhoneNumbers将为姓氏“ smith”的人返回家庭电话号码(123)456-7890。
了解如何编写一些代码
实现将满足您编写的测试要求的方法。
考虑到我们获得的申请人数量和质量,我采访了所有认真申请过的人。我没有雇人。
针对以下问题编写算法:给定数字n,输出具有n个节点的(唯一)二叉树的总数。
因此,对于n = 0和n = 1,答案为1。对于n = 2,您拥有2:根节点,然后是左侧或右侧的第二个节点。
您可以深入了解设计技术,并了解他们是否想到了递归或记忆或动态编程解决方案。
[也请参阅此StackOverflow 讨论以了解相关的但不同的二分查找树的情况。
如果要采访软件开发人员,我会请他设计软件并描述硬件要求,以从任意大的文件(每行包含全名)中删除重复的条目。我故意使问题描述的某些部分含糊不清。然后,我向他提出挑战,看看他是否了解分析和澄清需求,不同的权衡,数据结构和算法,I / O(辅助存储),软件和硬件技术,可伸缩性等。
我认为这是一个小而具有挑战性的问题,它揭示了申请人在许多计算领域的知识和能力。
Implement function/method(on c/c++/c# whatever), which calculates n-th item of Fibonacci sequence
许多人可能会坚持下去。如果给出一些解决方案-通常使用递归。之后:
Implement the same via 'for'-loop
不能告诉你,有多少同胞未能完成两项任务-50%的应聘者。
这就是为什么我喜欢它:)
fib(n)=round(power(PHI,n)/SQRT5)
。PHI和SQRT5是分别表示黄金分割率(1.618 ...)和5的平方根的常数。
对于数据库,我使用:
表:事物 身份证名 1个Bodkin Van Horn 2胡斯 3胡斯·富斯 4热 5 Marvin O'Gravel气球脸 6尼姆 7 Marvin O'Gravel气球脸 8 Marvin O'Gravel气球脸 9戴夫
给我写一些SQL,该SQL将根据名称对像这样的表进行重复数据删除(我不在乎我返回哪个ID,但是无论返回哪个ID都必须对该名称有效)。因此,将正确的SQL应用于该表后,该表将显示如下内容:
表:事物 身份证名 1个Bodkin Van Horn 2胡斯 4热 5 Marvin O'Gravel气球脸 6尼姆 9戴夫
我喜欢它因为:
(在这里,我发现这样做的方法很简单,而这些年来我一直在使它复杂化)。
SELECT min(ID), Name FROM Things GROUP BY Name
会起作用,对吧?
HAVING count(Name) > 1
,但我想您的示例答案应该省略Bodkin Van Horn,Hot Shot,Snimm和Dave。
DELETE FROM Things WHERE ID NOT IN (SELECT MIN(ID) FROM Things GROUP BY Name)
。您有首选的解决方案吗?
我最喜欢的是从询问printf的原型开始。然后给定一个低级API printc(char c),它将打印一个字符,并实现printf。给出各种有趣的响应,例如堆栈是CPU的一部分。您可能已经猜到我来自C语言和嵌入式背景。
varargs()
类似的函数。我对么?我只说过一次就说了。
您有一个盛有200条鱼的碗。在这些鱼中,有99%不是孔雀鱼。您应该去除多少鱼,以便剩下的2%是孔雀鱼。展示你的作品。
这是关于混乱的要求。据说这种方法可以在同一问题中多次更改视角。旨在查看他们是否可以弄清楚到底发生了什么。
会有很多人弄错了,您会感到惊讶。
answer = 100
。[假设您可以有选择地挑选其他鱼。如果要删除孔雀鱼,还有其他答案。]好问题,您会惊讶地发现很少有人能很好地做到这一点,尽管这对于程序员来说应该是小孩子的玩法。
自从我开始使用它以来,我一直在使用的一个问题是:
编写函数以打印1到100之间的所有数字。
我一直使用它的大部分原因是因为您可以采取解决方案并朝各个方向移动:
您将如何修改该功能以打印1到1000、10000或n之间的所有数字?
他们对这些问题的回答可以使您了解他们如何响应不断变化的需求以及他们是否可以识别性能方面的考虑。一个强壮的候选人可能会回答一个问题,即该功能需要多长时间被调用一次。
朝着不同的方向前进:
如果您知道此功能每分钟将被调用几次并且性能令人担忧,那么您将如何进行更改?
我将其用作检查其横向思维的一种方式。由于最大值会变大,因此素数的计算可能会变慢,因此有时仅使用根据您要解决的问题进行调整的某种已计算或预先计算的查找表就更有意义。