雇佣世界上最聪明的人

有一个数组包含从1到的所有整数n个以某种顺序,除了缺少一个整数。建议一个有效的算法来查找缺失的数字。

当我开车送他离开机场时,一位朋友向我提出了上述问题。他刚刚参加了一次面试,面试中他们给了他两个问题。这个问题可以在线性时间和恒定空间中求解。

但我的朋友对下一个问题感到非常兴奋:

有一个数组包含从1到的所有整数n个按照一定的顺序,除了一个整数缺失,另一个整数重复。建议一个有效的算法来找到这两个数字。

我的朋友发现了一种算法,它也适用于线性时间和恒定空间。然而,面试官并不知道这个解决方案。面试官希望算法能在n个日志n个时间。

该公司声称,他们正在寻找世界上最聪明的人,我的朋友为他们提供了一个令人印象深刻的解决方案。尽管他很兴奋,我还是预测他们不会雇佣他。猜猜谁是对的?

我这样反应是因为我自己的故事。许多年前,我在一家公司面试,该公司也需要世界上最聪明的人。在采访中,那家伙给了我一张问题清单,但他说他并不指望我能解决所有的问题,只有几个。这些问题太难了,他想和我坐在一起读,以确保我理解它们。

问题是奥运会风格,这是我的专长。当我们在读的时候,我解出了一半。在接下来的一个小时里,我解决了剩下的问题。面试官大吃一惊。他告诉我一个额外的问题,他和他的同事们已经试图解决很长时间了,但无法解决。他让我试试。我也解决了这个问题。你猜怎么着?我没有被录用。因此,我对朋友的采访做出了反应。

好消息是:我仍然记得他们无法解决的问题:

一辆汽车在一条有几个加油站的环形道路上。加油站的汽油不足,加油站和车内的总可用汽油量正好足以让汽车绕马路行驶一圈。道路上真的有一个地方可以让汽车开始行驶,在每个加油站停下来加油,这样汽车就可以完成一整圈而不会耗尽汽油吗?假设汽车油箱足够大,不会出现限制。

共享:脸谱网推特红色编辑品脱师链接(linkedin)邮件

58条评论

  1. 埃文·伯克维茨:

    我想我用线性时间和恒定空间来求解这两个问题。不过,我的解决方案需要知道两个相对微不足道的算术事实…

    这些都是好问题!

  2. 狮子座:

    XOR是程序员最好的朋友!

  3. 亚当:

    三种可能性:
    -招聘人员知道公司里的大多数人都不是特别聪明,但为了士气,他们想保持这种幻想,而雇佣一个真正聪明的人会消除这种幻想。
    -大多数人无法区分比自己高出一级以上的智商差异,因此,通过宣传“世界上最聪明的人”,他们获得了拥有真正聪明人的声誉,而无需寻找任何聪明人。
    -整理面试问题清单的人其实很聪明,他们知道这些问题会很有趣,也很快就会出现,但他们把问题交给了面试官,没有给出解决方案,也没有说问题有多难。

  4. 比尼特:

    因为正确回答了“那些”问题而不录用似乎很微不足道。我不是招聘决策方面的专家,但似乎不太可能有人会因为计算能力而拒绝申请人。事实上,大多数优秀的公司都在寻找这样的能力。此外,在混乱中寻找模式显然是人类的一项超能力。

  5. 史蒂文:

    你被录用的原因是什么?

  6. 米盖尔·平:

    以下是前两个问题的通用解决方案🙂

    https://stackoverflow.com/questions/3492302/easy-interview-question-got-hanorder-given-numbers-1-100-find-the-missing-number/3492664#3492664

  7. 托尼:

    那家公司听起来像谷歌…

  8. 赚钱:

    第一:

    (array.length^2+array.rength)/2–总和(数组)

  9. 埃里克:

    不知道我是否正确理解你。你怎么知道这些就是你和你的孩子没有被录用的原因?

  10. 库恩:

    对于这个问题,我很怀疑你有一个固定的空间解决方案。提示:即使存储整数n也需要O(log(n))的空间。

  11. xil公司:

    公司正在寻找足够聪明的人来做这项工作。数学或编码黑客很难被激励,他们无法忍受做行政等填充工作。因此,人力资源部倾向于不雇佣这些人。然而,在许多情况下,像你这样的人往往会在初创公司或地下团队中茁壮成长。不是在企业界。给你儿子一个提示,周围有大数据初创公司在寻找算法向导。🙂

  12. 迈克尔·瓦茨:

    假设有n个站,s_1,…,s_n,排列在我的圆圈周围。我沿着每个加油站的圆圈顺时针延伸一条彩色弧线,表示从该加油站出发可以行驶多远的距离。根据假设,这些弧的总长度是圆的周长。如果没有弧到达另一个站,那么总长度将小于该值,因此有一些站s_i储备了足够的气体到达站s_{i+1}。

    现在考虑有n-1个加油站的问题:t1,…,t1,t{i+2};所有其他的tj储存sj处的气体量。实际上,我们已经将s{i+1}中的所有气体倾倒到si中,然后移除s{i+1}。

    如果我们重复这个过程,我们最终会留下一个包含所有气体的站。该工作站将作为原始问题的起点。

  13. 特贾斯维:

    使用整数和和整数平方和,形成两个线性方程组,其中一个变量缺失,另一个变量重复

  14. 迈克尔·瓦茨:

    我假设汽车从0开始,但你可以假设0时油箱里的油实际上已经储存在你选择的加油站,比如s_1。

  15. 克里斯蒂安·根科(Christian Genco):

    https://mathworld.wolfram.com/ArithmeticSeries.html

    n(n+1)/2–列表总和(以线性时间计算)=缺失的数字

  16. 马里奥:

    嗯,我看不到XOR解决方案。前N个整数的XOR有一个性质吗?我有线性时间和常数空间解,涉及这两个问题的和和和平方和的一些性质。

  17. 约翰:

    通过按“可用气量”/“到下一个加油站的距离”的比率对加油站进行排序,可以解决环形问题。然后,任何能让你以最佳比率到达加油站的起点都会很好。

  18. 普肖斯:

    车的问题很好:
    你从一个任意的站开始,从一辆空车开始,沿着任意的方向前进,描绘坦克的演变,直到你回到原点。站达到最低值应该是起点,因为你不可能在之后进入负消耗。

  19. 法比奥:

    我假设常量空间是指存储恒定数量的数字,而不是恒定数量的位(存储n需要O(logn)空间)。
    如果是这样的话,我想我得到了和Evan一样的解决方案;如果没有,我就很困惑。

    汽车一的工作原理是简单的归纳法,除非我遗漏了什么(提示:假设汽车没有燃油)。

  20. 乔什·利夫斯:

    那你怎么看?你为什么认为这些公司不会雇佣世界上最优秀的人?

  21. 第xx页第xx页:

    对于最后一个问题,答案是:是。
    使用图形表示可以很容易地回答这个问题。
    我认为也有可能从这个表示中得到证明。

  22. 库恩:

    想想看,这取决于你选择的分析水平。如果假设每个整数的空间为常数,那么它确实可以用O(1)额外的空间来求解。例如,在分析排序算法时通常会假设这一点,我想这也是您的想法。

  23. 皮特:

    “常量空间”是否允许一个额外的整数?我猜是这样的,尽管它需要log(n)位。

  24. 安德斯·皮尔逊:

    是的。在大多数情况下,“世界上最聪明的人”实际上是指“世界上实际上并不比我们聪明的最聪明的人们”。

  25. 埃文·伯克维茨:

    是的,我的意思是用我需要存储的额外整数表示“常量空间”。

    我用1+2+3+4+…+n=n(n+1)/2这个事实来解决第一个问题,就像赚大钱一样。一个类似的思考过程给出了第二个问题的解决方案,只是有一点点复杂。

  26. OMF公司:

    在爱尔兰,说某人“聪明”意味着他们只会取笑别人的错误。

    我有时认为这就是这个词的真正含义。

    由于这个问题似乎允许访问列表中的数字,并且因为它们是有序的,所以您还可以使用分支二进制搜索来查找丢失的数字。如果有几个数字丢失,这也会起作用。但它仍然具有O(N)复杂性。

  27. 杰瑞JvL:

    即使从字面上理解常量空间约束,这仍然可以实现。

    以下情况需要特殊铸造:
    n=1(空数组表示答案为“1”)
    n=2(结果是数组中没有的值)

    从n=3开始,数组本身总是足够大,可以包含答案,无论它需要多少位,这意味着只需要一个指针/计数器来迭代数组。

    缺失和重复的问题通过特殊的大小写n=2来解决,并且从n=3开始,数组中始终有足够的位来存储完整的答案。

    当然,如果我们被允许破坏输入数组的内容,这是当然的,但由于问题并没有说明这是不允许的,所以我认为可以放心地说,在这两种情况下,常量空间解决方案都是可行的,即使在最严格地解释什么是“常量空间”的情况下也是可行的。

  28. 法比奥:

    @杰瑞:如果你存储数组,你已经在存储O(n)个数了,所以你不能得到次线性空间。
    获得亚线性空间的唯一方法是使用某种流模型:你可以看到数组中的每个数字一次,然后它就消失了。如果你想的话,你可以把它储存起来,但那样会占用空间。
    如果可以重用数组的空格,只需查看[0],然后转到[a[0]],读取该数字(将其移动到其他空格),将[a[0]替换为-1(表示您看到该数字一次),然后继续迭代(如果循环,则返回到最后一个未检查的位置)。你可以很容易地检测到重复的数字,一旦你完成了这项工作,你可以在线性时间内检查丢失的数字。
    这是可行的,但不是真正的恒定空间。

  29. Foo公司:

    也许他们不喜欢你朋友的个性?

  30. 鲍勃:

    我讨厌公司在工作岗位上撒谎。

  31. 天哪:

    假设它们实际上是有序的,那么确定顺序。假设升序,并假设一个1索引数组,数组[n]==n;是测试,您可以使用基本的二进制搜索算法来查找array[n]=n、 然后缩小这种现象的起点和终点。如果n<=数组[n],则缺少的在下面,重复的在上面。如果n>=数组[n],重复项在下面,缺少项在上面。如果n==数组[n],我们还没有找到区域。在所有情况下,这都可以在O(logn)时间和线性空间中完成,假设您决定以迭代形式而不是递归形式编写二进制搜索。

  32. 两次Elisp挑战|无意义:

    [……]在Tanya Khovanova的数学博客上遇到了几个很好的采访问题和一个有趣的故事。这两个问题[…]

  33. 赚钱:

    没有额外空间的问题一的解决方案:

    int find_missing(int*数组,int长度)
    {
    if(!length)返回1;

    如果(长度==1)
    {
    返回3–长度;
    }

    如果(长度==2)
    {
    返回6–数组[0]–数组[1];
    }

    长度–;

    数组[长度–1]+=数组[长度];

    长度–;

    (;;长度–)
    {
    if(长度)
    {
    数组[长度–1]+=数组[长度];
    数组[长度]=0;
    }
    其他的
    {
    数组[0]+=数组[1];
    数组[1]=0;
    断裂;
    }
    }

    while(!数组[++长度]);
    长度+=2;

    return(length*length+length)/2–数组[0];
    }

  34. 赚钱:

    应返回3–数组[0]

  35. L33t最小:

    我认为,汽车问题归结为广义鸽子洞原理。迈克尔·瓦茨说得对。

    我认为ckuehne也是对的,存储恒定数量的值与恒定空间不同。虽然我猜我们假设数字存储在固定宽度的东西中,可以存储值至少为n的项目。

  36. 狮子座:

    @马里奥:Y=1 XOR 2 XOR…XOR n XOR a[1]XOR a[2]XOR……XOR a[n]将为您提供缺失的数字XOR重复的数字。Y中的1位表示它们的不同之处。让我们找到Y中最低有效位1的位置,然后再次遍历数组,只求该位置中位1的值的总和。通过将总和与期望值(可以与数组遍历并行计算)进行比较,我们将找到其中一个数字,以及它是否丢失或重复。另一个数字是第一个数字的YXOR。

  37. 杰瑞JvL:

    @法比奥:请参阅@MakeMonies的解决方案,了解我的意思;如果破坏性地使用传入输入数组的空间(而不进行本地复制!),则只需要一个常量空间。请注意,即使使用输入数组中的任何形式的可变长度编码,只要我们可以自由选择结果输出的合适编码,这通常也是可行的。

    @MakeMonies:如果您将索引添加到结果中,同时减去单个值,那么您的实现可能会得到进一步改进;使用乘法(以及数组[0]中的求和)的最终计算可能溢出并可能导致问题,而迭代期间的累积保证永远不会超过结果的最终值。

  38. 尼基尔:

    第一个很明显:
    对给定的序列求和(缺少一个)。求级数1的和:n=n(n+1)/2。差异是缺少的值。

    第二个涉及一个简单的身份。x^2–y^2=(x-y)(x+y)
    考虑序列A,其中一个值A替换为b;我们还有B系列,1:n即正确的系列
    计算总和(A)–总和(B);这相当于b-a
    计算总和(A^2)–总和(B^2);这是b^2–a^2=(b-a)(b+a)
    替换以获得答案

  39. 法比奥:

    @杰瑞:是的,我理解你的意思。
    这假设您必须在某个可以写入的位置保存数组的整个副本。拥有此副本需要存储n个数字,因此您正在使用存储这些数字的空间。
    我将次线性空间解释为,我们正在考虑某种流模型,其中输入以在线方式到达:例如,你通过网络一次接收一个数字,你无法将数据存储在任何来源。
    使用数组存储的空间是使用线性空间(或n log n位)。
    换句话说,该语句表示常量空间,而不是常量额外空间。

  40. 杰瑞JvL:

    @法比奥:流式输入的可能性已经足够了,但我当时正在解释,问题陈述中的“有一个数组包含”意味着我们有一个可寻址的数组可以操作。

  41. 麦琪:

    中值定理能应用于加油站问题吗?使用与MVT类似的逻辑,我会说是的…

  42. PJ公司:

    是的,看看你或你的朋友是怎么被录用的。喜剧演员需要优秀的人,但又不至于让大师相形见绌。如果你真的很棒,你会在那里呆一段时间,沉浸在他们提供的最好的东西中,然后离开,形成更好的东西。他们确实对这件事感到恐惧。

  43. 大卫·克罗克:

    是的,当他们在招聘时,他们没有提到关键信息,那就是他们正在招聘世界上最聪明的人,他们并不比招聘人员或在职员工更聪明。

  44. 米沙:

    如果你想得到这份工作,解决所有问题是一个错误。为什么要先羞辱你可能的雇主?

  45. 鲍勃·比克斯勒:

    大卫·克朗克和米莎说得对。由此得出的结论是:当你的老板错了的时候,你就不会有正确的未来。

  46. 名副其实的数学极客:

    如果你能解决这三个问题,那就太棒了。
    令人难过的是,雇主通常不希望他们的员工比他们聪明。但说真的,这些公司的名称是什么?

  47. 史蒂夫·克拉玛奇(Steve Clamage):

    如果你比公司预期的聪明,但仍然没有被录用,这并不一定意味着你太聪明了。他们可能因为其他原因解雇了你。仅列出我在评估申请人时遇到的一些问题:
    –个性不适合组织(可能无法与他人合作)。
    –简历显示频繁的工作变动(可能也会辞职)。
    –离职的原因:“老板是个白痴。”(真的吗?所有人?)
    –申请人的重点是福利、假期等,对实际工作没有兴趣。

    如果你真的因为太聪明而被解雇,你可能会讨厌在那里工作。
    我的建议是在面试中表现出你的本色。如果你得到这份工作,那就是谁将在那里工作。如果他们雇佣你是因为他们认为你是别人,你都会不开心。

  48. 亚当2:

    @史蒂夫
    假设最终每个人都找到了一份自己满意的工作,而且不需要钱来生活,那一切都很好。
    我宁愿他们雇用我,然后自己决定。
    不幸的是,就业市场是一场音乐椅游戏,大约10%的椅子不见了。

  49. 回到数学|我的想法实验室:

    […]可以在此处阅读文章:https://blog.tanyakhovanova.com/?p=402。我想在这里发布它并讨论解决方案:问题1:有一个数组[…]

  50. 迈克:

    这个问题是不完整的,并且做了太多的假设。抽象是开发人员能够学到的最关键的东西。

  51. 塔伦·阿南德(Tarun Anand):

    对于汽车问题
    假设有两辆车,一辆顺时针行驶,另一辆逆时针行驶……圆圈中一定有一个点,它们可以朝相反的方向行驶,然后在起点处会合。

  52. d发射Od:

    汽车问题。

    我假设,汽车的油箱一开始是空的,但在起点s_0有一个加油站,加油量等于汽车油箱中的油量。
    我假设这个圆的长度是1。我假设,汽车需要弧长的气体量才能从弧的起点移动到终点。
    现在让我们看看加油站si,如果油箱是空的汽车能够到达si+1加油站,当我们可以安全地将汽油从si+1“转运”到si,使其保持住
    如果加油站不同,累计加油量。这个过程结束后:甚至并没有一个加油站有足够的天然气到达下一个,或者只剩下一个,在这种情况下,我们就完成了。所以在前一种情况下,我们只汇总所有站点的天然气量,当1。矛盾。

  53. 弗兰克·沃尔夫:

    汽车问题:让Si成为最大的加油站。Si是最大的,大于1/n,因此将确保Si中的任何人都能访问Si+1。合并Si和Si+1(模n)。递归假设可确保所有加油站都有通路(但Si+1–如上所述)。作为练习:现在证明它适用于2站电路…

    我不是imo玩家,遗憾的是,我远低于这个水平。我甚至不从事类似计算机的工作。真正令人惊讶的是,这位雇主和他的同事未能解决这个问题。那么,他们当然应该选择另一份工作(还是我应该选择?🙂 ).

    但情况并没有那么糟糕。你不雇佣你的老板;反之亦然。你也不会雇佣一个会一直向你证明错误的人。你也不会去找一个有能力薄弱迹象的老板。最后,糟糕的原因导致了正确的决定……aa&这就是面试的目的!

  54. 塔尼亚·霍瓦诺娃:

    弗兰克,我想你认为电台分布均匀。他们不是。

  55. 弗兰克·沃尔夫:

    没错。实际上,选择Si更简单。只需选择一个向下一个加油站提供足够汽油的加油站。至少有一个,否则就没有气体来完成回路。

    呃,除非我又错了。这让我想起了我的上一位数学老师。他在课程中寻求不同的观众参与(在一个学生都是哑巴的国家)。他会说“来吧,提出一些想法。数学课程是生活中欢迎错误陈述的地方。不要错过这个机会”。猜猜是谁拿走的…

  56. 沃伦·德·史密斯:

    我喜欢迈克尔·瓦茨(Michael Watts)对气体/循环问题的解决方案。

    1.请注意,解决方案可能是一个独特的点(例如,如果恰好有一个加油站,汽车的油箱在开始时是空的)。

    2.另请注意,如果我们问:是否存在汽车可以从中启动的起点
    在任何一个方向画一个圆圈,然后回答可以是“否”-
    例如,空的汽车油箱,两个相邻的车站
    一半的汽油。

    3.给定每个站点的位置和含气量作为输入,找到气体/循环问题的起点的计算复杂度是多少?
    如果加油站是按角度顺序输入的,那么就有可能解决这个问题
    以O(N)步和O(N。绘制方法:使用双链接
    列表以按角度顺序存储加油站。按所述浏览列表一次
    迈克尔·沃茨,找到两个站合并。(通过删除完成组合
    列表中的前一站,并将其与前一站的含气量相加。)每次你把二者结合起来,检查一下新的超级状态是否可以
    “触及”其继任者,如果是这样的话,将其合并;否则继续扫描。
    该问题将在线性总时间内解决(全部合并为一个问题)。
    但这是一个“只向前”的算法,从不需要“回溯”。因此,实际上只需要一个单链表就可以实现这一点;
    更棒的是,只要我们有O(1)个单词的存储空间
    循环磁带式访问只读的只向前扫描输入。

    4.现在你面临一个新问题:
    白痴们在月球表面投下了N个加油站。他们的位置
    燃料成分是任意的。现在你,一个聪明的宇航员,选择你的位置
    想和你的月亮宝宝一起登上月球。你的目标是
    坐着马车环游月球。
    证明:
    如果N个仓库的总燃油量至少为C*N^(3/2),
    其中C是一个足够大的常数,
    那么月球上至少有一个点,从那里开始,
    月饼能到达每个仓库。
    尽量找出C的最小值,这样这一点就保持不变。
    另一方面,如果C太小,则可能没有这样的起点
    存在。试着找出C的最大值,这样就可能发生这种不存在的情况。

  57. 阿比舍克:

    很抱歉,我知道这很旧,但我想提出一个关于“为什么他们没有被聘用?”
    所以,他们说,“我们正在寻找世界上最聪明的人。”现在,他们通过在面试中提出的问题,已经确定了他们需要的聪明程度。现在,如果申请人不能回答其中至少50%的问题(或者他们设定的任何限制,记住他们会说“只有几个”),那么你就没有资格胜任这份工作。如果你解决的问题远远超过了这个限制,那么你就太适合这份工作了。

    现在这样想吧,面试官在想雇用一个人的时候,会提出最棘手的问题。现在,如果你能很容易地解决所有这些问题,这意味着你太适合这份工作了。他们必须比其他员工更经常地为你制造更多的问题。然后会有一个限制,当他们不能再制造任何对你有挑战性的问题时。这将导致你辞职。他们事先知道这一点,只是不雇佣你,以节省你宝贵的时间。

    附言:这是我的一位教授的真实故事,他本人也是一名招聘人员。

  58. 安吉洛·斯科多:

    当我因健康原因换工作时,我试图找一份责任较少的工作。
    我给公司老板打了电话,说:我有空。
    他回答说明天来。
    我添加的任何其他内容都会阻止
    招募的可能性。
    当你在找工作时,唯一重要的想法是了解
    他们在寻找什么,并使自己适应职责。
    公司老板正在寻找能立即解决问题的人,
    准备明天开始。
    他对你有多聪明一点也不感兴趣。

留下评论