您最喜欢的白板面试问题是什么?[关闭]


52

就像标题中所说的,您最喜欢的白板面试问题是什么,为什么对您有效?

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


4
我讨厌的一个问题是爱因斯坦之谜。stanford.edu/~laurik/fsmbook/examples/Einstein'sPuzzle.html我在30分钟内无法做到。但是后来我很生气,发现了这一点:games.flowix.com/en/index.html因此,我训练了平均在20分钟内解决一个6 x 6 x 6难题。我想我现在可以在30分钟内处理5 x 5 x 5。雇主会向我抛出任何愚蠢的困惑-我会记住它们,并在下一次给他们加油。有很多好的谜题。
Job

20
@Job:没有一个可以告诉您有关员工在工作中的表现的任何信息。当然,除非您将所有的工作时间都花在解决这些难题上,而不是完成实际的工作。
罗伯特·哈维

1
@Robert Harvey您的意思是您所从事的业务是除解决难题以外的其他方式?我不知道...;)虽然这个难题很有趣。附带说明,我曾经工作过的一家公司使用实际的 IQ测试作为筛选的第一步。我想找到一些很好的白板问题,以区分最佳候选人,而不是仅仅筛选他们。
妮可

4
@Renesis:作为一名开发人员,我可以看到解决难题的方式可以识别解决问题和分析的技能,但是开发人员还必须知道如何将该解决方案转换为代码。解决难题只显示执行的一半。解决Rubix多维数据集与编写算法解决Rubix多维数据集之间的区别。
罗伯特·哈维

@Robert Harvey我同意,我特别在寻找编码问题,而不仅仅是思考问题。
妮可

Answers:


22

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

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

具体例子

(对于Java桌面开发人员)

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

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


40

在采访候选人并筛选出没有业务的候选人时,我发现这一点很有启发性。它的复杂度与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。


2
啊,我看到有#4问题。您的文档每行只有一个关键字,因此您不能知道“蓝色”和“黄色”分接头
glasnt 2010年

8
哎呀!我可以在面试中看到自己不愿(4)。@Job:作为面试官,我想请候选人解释这个问题,希望他偶然发现自己的问题,看看他如何处理。(通常能告诉您的信息不只是候选人在第一次尝试时提出的问题。)
peterchen 2010年

3
@Renesis,我不确定这是否真的很深入。这对于确定某人是否具有基本的SQL查询技能似乎非常有用。实际上,对于这些天来很少有开发人员具备这些基本技能,我感到震惊。
Mark Freedman

2
@ jk01,也许我对此持保守态度,但是IMO一个全面的开发人员应该具有一些DB知识,即使不是通过代码访问,也至少要通过试验查询来了解领域。没有这个,开发人员将有一个相当大的盲点。它对于系统支持和故障排除也非常有用。抽象可以很好地帮助简化开发并提高生产率,但是我看到了太多的假设,因为这种假设经常被抽象掉。我可以继续,但是我想这可能是另外一场辩论,我确定其他地方都在发生;)
Mark Freedman 2010年

4
@ back2dos-看,不要因为不能回答而被冒犯。可能还有很多其他技术可以简化此过程,但是我们使用了很多SQL数据库,而且我招募的人知道如何使用我们使用的技术,而不是为他们为什么不必回答我的面试问题找借口。
JohnFx 2010年

20

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


您将如何定义设计?您在寻找类图吗?另一个UML图?各个层的基本草图?
justkt 2010年

1
我称它们为气球。;)只需绘制冰柱,放置名称,然后将它们与命名的箭头连接即可。我不在乎他的申请,但在乎他了解这一事实。
Uberto 2010年

5
+1。对于以前有工作的人来说,这绝对是您可以做的最好的事情之一。如果他们能够解释项目的结构,那么它已经非常有价值。如果他们有一个想法,为什么要以这种特定方式进行结构化,或者如何更好地进行某些工作,那么这确实是一个巨大的优势。
back2dos

3
@justkt:重要的是,被访者可以获得整个信息。无关紧要。我遇到了真正了解UML的人,他们无法用它来解释事物,也遇到过可以用几行曲折的路线来解释复杂系统的人。
back2dos

2
到底该如何在不透露任何敏感细节的情况下绘制项目设计?
Nemanja Trifunovic

14

实施strcpystrcmp和朋友。


4
请候选人实施atoi()
chrisaycock 2010年

2
你会惊讶于有多少人无法实现strdup()
Tim Post

10
如果职位空缺是针对C程序员的,那才是公平的。

在我当前工作的面试中,面试官要求我实现strrev()或反转字符串功能。我的白板解决方案给他们留下了深刻的印象,我现在正在工作。
Gulshan

@crisaycock atoi()很简单。itoa()是不真实的
Michael Brown

14

我最喜欢的涉及几门学科的是,给定接口(在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#语法的知识:
    • 仿制药
    • 扩展方法
    • 三元运算符

可以是扩展方法吗?
Gulshan

在这个时代,是的。当时我们使用VS 2005进行编码,因此语法比较稀疏。
Jesse C. Slicer 2010年

在获得原始类的源代码后,为什么还要使用扩展方法?那不是扩展方法的目的。
Batibix

“假设我可以更深入地研究,并向候选人展示此类实现的接口。要点是,无需修改原始类-一些入门级开发人员可能希望向该类添加内容以使请求“更容易”。
Jesse C. Slicer 2010年

看起来很像Java的废话!
测试

12

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

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

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


31
嗨,我什至没有资格判断答案...我想第二个,你需要12支黑蜡烛和一只山羊...
Uberto 2010年

4
第二种方法很简单,您的操作系统将处理器缓存和堆栈以及RAM的内容保存到硬盘驱动器,然后在计算机重新开机时将其还原。
Malfist 2010年

但是,第一个问题可能需要几天才能解释。
Malfist 2010年

@Malfist我的意思是Java Hibernate持久性框架。
加里·罗

2
@Paul Stephenson是的,但可以肯定的是
Gary Rowe 2010年

8

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

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

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

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


+1,我喜欢您的方法在动态编程者或此类概念很少用于业务编程时问他们是没有任何意义的。+重点也应该与代码质量有关,而不仅仅是解决方案。
怪胎

我不介意设计问题,但是我曾经采访过一个爱好业余爱好的人,他有一些可怕的问题。就像我问别人武术问题一样。
鲍勃·墨菲

可能应该确保人们知道您在(3)中的意思是“排序数组”,对吗?
HaveAGuess13年

7

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

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

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


6

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

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

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

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


2
+1对于最后一段,这很重要。通常,解决问题的关键不是答案,而是达成目标的途径。正如我所有的数学老师曾经说过的“展示你的工作!”
2010年

4

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

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

之所以有效,是因为:

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

  2. 它是独立于语言的。

  3. 几乎没有人能完全正确地解决问题(通常会漏掉一个极端情况(通常是1或2个),或者他们不处理负数,因此您可以了解他们如何处理错误并被告知错误。

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

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


我曾经遇到一个面试问题,给我一个非常模糊的C代码块,并要求找出它的作用。它以一种非常全面的方式打印出其他所有质数。300人提出了申请,他们给了我这份工作,因为显然我是唯一告诉他们这份工作的目的的候选人,而不是传授价值观。是的,+ 1是一个很好的检验。特别是如果他们想出了一个筛子,尽管这在计算复杂性与空间复杂性之间进行权衡。
2010年

1
1不是素数

2
@Thorbjørn-显然,但是我看过用来解决此问题的例程中的很大一部分告诉我,是
Rhys Gibson

那么他们就有一个错误:)

3

叫做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根本没有任何区别。这通常是一个令人难过的时刻,老实说。)


1
您是否曾经有面试的候选人对此感到侮辱?还是认为您只是在以娱乐为代价而不是进行认真的面试?
妮可

@Renesis:我有些傻笑着看着我。其中一些未通过测试。总的来说,好候选人如果笑了,就会大笑。例如,对于JS程序员,我有很多候选人都以“ du variablename = variablevalue;” 使面试答案不及格,而优秀的候选人只是在电话里或当面大笑,直接告诉我,选择或不选择会有什么不同var)。
haylem 2010年

1
@Renesis:另外,如果有人冒犯了我,我真的不在乎。绝对没有区别。如果他们被冒犯了,那么我会假设他们是那种不喜欢接受测试或质疑的人。但是,我从未真正让求职者感到我以牺牲他们为乐。我通常问非常简单的问题之前就道歉因为对好人来说这可能会浪费时间。但事实是,这对我来说不是浪费时间。从长远来看,不问他们会否。
haylem 2010年

@Renesis:通常不是这样,在笑/冒犯/冒犯了我之后,我得到的是羞愧的表情和对失败的人的道歉,或者当他们意识到这没用时就开始为整个测试编写分支。是的,我确实很乐于提供此测试,但是如果不是出于充分的理由,我不会给出测试。
haylem 2010年

就我个人而言,阅读该书时我会有精神上的脸红,想知道是否有人写了这个问题供面试官取笑他。
wildpeaks 2010年

3

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

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

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

a)请计算月牙面积。 新月数学问题

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

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

内方圆内方圆

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


1
a)的答案是128.75?(不知道我是否犯了任何错误)。我喜欢它,但更多的是关于几何。
晃龙

2
另外,对于延迟发表评论也感到抱歉。我一般不喜欢不赞成投票,而是不加评论为什么。我的不满不是问题本身,它肯定对您有用,我只是认为在编程采访中它没有适当的背景。
菲利普·里根

7
-1是因为几何图形是即时学习的理想选择,并且不能反映我创建高质量软件的能力。
Malfist

2
我很喜欢这个问题。希望您不要介意我分享(a)部分的解决方案。直径相差9厘米,因此如果内部圆的半径为r,则外部圆的半径为r + 4.5。新月形的面积是圆的面积之差:pi(r + 4.5)^ 2--pi * r ^ 2。剩下的就是找到r。将C定义为点(0,0),然后将点E定义为(0,r-0.5)(因为CE比大半径小5cm)。内圆向右移动4.5cm,因此其等式为(x-4.5)^ 2 + y ^ 2 = r ^ 2。插入(x,y)=(0,r-0.5)并求解r。
蒂姆·古德曼

2
+1,因为我认为这对要求几何的工作是个好问题。涉及到很多推理,而不仅仅是插入公式。就是说,我知道一些优秀的程序员之所以被绊倒,仅仅是因为他们十年来没有考虑过很多关于圈子的事情,但是这个问题并没有为任何开发人员面试提供合适的问题。当前投票最多的SQL问题(我也很喜欢)至少是针对特定工作的。
蒂姆·古德曼

3

我见过的最好的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));

1
您可能需要添加哪些特定的SQL方言,这是写入了数据。

功能风格看起来不错。
2010年

2

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

  • 设计意识。

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

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

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

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

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

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

  • 了解如何编写一些代码

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


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


在SQL#2中,您是在谈论在一个查询中完成所有操作吗?目的仅仅是为了评估对左/右或内部连接的理解吗?
妮可

@Renesis:是的。
史蒂文·埃弗斯

2

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


2

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

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

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

[也请参阅此StackOverflow 讨论以了解相关的但不同的二分查找树的情况。


那么一个不知道动态编程的UI程序员是一个糟糕的程序员吗?对于这个问题,任何无法回忆起动态编程的业务程序员都是不好的吗?topcoder的许多青少年都将解决动态编程问题,但请查看他们编写的代码。
怪胎

@Geek:请记住,“白板”问题是查看某人思考过程的一种方式。动态编程问题应归因于此讨论,因为它们在Google中非常受欢迎。
Macneil 2010年

我不同意,但我有两个问题。1.解决未知问题?如果您最近解决了一些问题,或者您仍然不记得大学时代的概念,DP问题将成为园区中的一小步。忘记了它的人肯定会在白板上做得不好。2.如果有人在努力解决问题,则无法量化他的代码质量。在诸如LinkList或Strings或Arrays之类的问题上给出问题,以便该人员可以解决问题并编写代码,该怎么办?
怪胎

我也不一定希望受访者能做到正确,但是有些公司会做到。
Macneil 2010年

@Geek:“一个……不知道动态编程的程序员是一个糟糕的程序员吗?” – 是的。话虽如此,我同意在不习惯动态编程的情况下思考并不简单。但是知道这是绝对必须的。
康拉德·鲁道夫

2

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

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


2

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

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

Implement the same via 'for'-loop

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


如果第一个实现是通过for循环完成的,该怎么办?
2010年

2
提议实现递归版本。通常在for-loop家伙成功实现递归版本之后。
alexb 2010年

或者,您可以将其实现为单个语句: fib(n)=round(power(PHI,n)/SQRT5)。PHI和SQRT5是分别表示黄金分割率(1.618 ...)和5的平方根的常数。
oosterwal

2

对于数据库,我使用:

表:事物

身份证名
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戴夫

我喜欢它因为:

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

(在这里,我发现这样做的方法很简单,而这些年来我一直在使它复杂化)。


1
我想我不知道什么算是“完全琐碎的”……类似的事情SELECT min(ID), Name FROM Things GROUP BY Name会起作用,对吧?
Tim Goodman 2010年

@Tim-这样就可以算出一切。我只想要那些重复的。假定它已缩放到数百万行,则手动编辑的结果不计在内。这是一个简单的问题,但是根据我的经验,有80%的人声称知道SQL甚至无法达到您的第一个目标。
乔恩·霍普金斯

@乔恩:不知道你的意思是“那为一切计数”。在示例解决方案中,您想要的是每个唯一名称一行。从您的评论看来,您似乎可能表示HAVING count(Name) > 1,但我想您的示例答案应该省略Bodkin Van Horn,Hot Shot,Snimm和Dave。
Tim Goodman 2010年

@Tim-你说得对,真的不清楚。我会在几分钟后编辑。
乔恩·霍普金斯

1
我想我会这样做:DELETE FROM Things WHERE ID NOT IN (SELECT MIN(ID) FROM Things GROUP BY Name)。您有首选的解决方案吗?
Tim Goodman

2

我最喜欢的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

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


具有C ++随机播放功能的vector <Card> :)
正确的

1

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


我没有得到“堆栈是CPU的一部分”的东西。
barjak 2010年

任何对计算机体系结构一无所知的人都会知道这一点。对我来说,这是完全无关的,所以那家伙正在表现出他的无知。
Michael K 2010年

@aufather:如果我没记错的话,您必须调用varargs()类似的函数。我对么?我只说过一次就说了。
Michael K

@barjak-一旦开始实现printf,您将需要访问您的堆栈,并且我得到了该堆栈在CPU中的响应。
2010年

@Michael-在嵌入式世界中,您需要非常了解您的平台架构。因此,这个问题很快在很早之前就消除了无知。
2010年

1

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

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

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


4
在碗中添加两个12英寸的奥斯卡奖杯,它们很快就会清除98%的孔雀鱼。
怪胎

如果您删除孔雀鱼会怎样?

1
1%孔雀鱼= 200 x 1%= 2(200-2 = 198条其他鱼),其中2 = 2%,其余鱼= 98%= 98(1:1)。98 = 198-100 => answer = 100。[假设您可以有选择地挑选其他鱼。如果要删除孔雀鱼,还有其他答案。]好问题,您会惊讶地发现很少有人能很好地做到这一点,尽管这对于程序员来说应该是小孩子的玩法。
2010年

1

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

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

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


1

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

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

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

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

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

朝着不同的方向前进:

如果您知道此功能每分钟将被调用几次并且性能令人担忧,那么您将如何进行更改?

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


1

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

编写一个程序(或过程),该程序将一对整数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));
}

0

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

public int getMode(List<Integer> numberList) {


}

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


-2

您将如何表示一个相对较大的备用矩阵(例如1000x1000,但最多具有100个非零条目)?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.