`
stormspire
  • 浏览: 14682 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

讨论一个算法,GOOGLE的一个面试题

阅读更多
这个是google的一个面试题,觉得挺有意思的,问题是这样的:一共有25匹马,有一个赛场,赛场有5个赛道,就是说最多同时可以有5匹马一起比赛。假设每匹马都跑的很稳定,不用任何其他工具,只通过马与马之间的比赛,试问最少得比多少场才能知道跑得最快的5匹马。[也许至少会产生误解,换成最少,就是考虑你的算法的最坏情况下]

以上就是这个问题。其实拿起笔来,仔细看看倒是不是很难。  (后来仔细想了想,其实并不简单)

如果推而广之,有N匹马,有M个赛道,试问要至少多少场比赛才能知道跑得最快的Y匹马。

在CSDN上看到另外一个题,http://topic.csdn.net/u/20081017/14/826303de-1871-4e50-89e8-47ed56f49acc.html
实际上就是把N换成256, M换成2, Y换成3
-----
另外有个朋友提出的描述方法浅显易懂,反正25匹马要分5组的,大家在下列统一的马匹归类下讨论比较容易

前5轮应该没有什么争议,就是5个队都比一场,暂且这样排名,名字在前面的快些。
A组 A1 A2 A3 A4 A5
B组 B1 B2 B3 B4 B5
C组 C1 C2 C3 C4 C5
D组 D1 D2 D3 D4 D5
E组 E1 E2 E3 E4 E5

第6轮目前比较统一的做法是让 每个组的第一,即A1,B1,C1,D1, E1比一场,假设 A1>B1>C1>D1>E1 那么这个时候可以淘汰一些马了,淘汰的用--表示,如下:
A组 A1 A2 A3 A4 A5
B组 B1 B2 B3 B4 --
C组 C1 C2 C3 -- --
D组 D1 D2 -- -- --
E组 E1 -- -- -- --

分歧就在第7轮了,我也没想清楚最佳方法,我就不在第一个帖子说了。
分享到:
评论
42 楼 lipengyu2006 2008-10-31  
哈哈,没看请题目。
我改下以前的答案。
好像应该是10场。
第六场比赛后 都让没次比赛都是最快的5五匹马比赛。
最坏的情况是五匹马全在一个组里
应该最少是10场吧
41 楼 superloafer 2008-10-31  
用插入排序法给一个数组排序,至少要n次比较,就是当数据都是顺序的时候,因为只有比过n次之后你才知道数组已经是排好序的。这时候问你用这个算法至少要比较数据几次,就要回答n;用顺序查找或二分查找法查找一个数据,最差和一般情况的时间复杂度分别为O(n)和O(lgn),但是如果问至少几次可以找到呢?两者都为一次,因为就是理想情况下一戳就中。
这个题目就算马匹的排序完全理想,也不可能在第六场找出前五名来。当第六场跑第五的马和其他队的第二的马(不包括它自己队的队员)进行第七场比赛跑一次,“理想”情况下他要是跑了第一名把各队的第二都赢了,第七场就能出结果了。这个题目的理想情况就是:在第六场跑出来的五匹马其实就是前五名了,但是除了第一名之外的其他2,3,4,5名都还没有跟其他队剩下的队员比赛,他们无法证明自己就是真正的前五。好,这个时候,最快速的证明方法就是把他们当中实力最弱的第五的马拉出去战斗,和各队(除了它自己的队员外)中最厉害的第二名比一场,立马就可见分晓。他要是赢了的话,就可以给自己和第六场的第二,三,四名正身了。这道题目问的就是“至少”,而要达到这种“至少”本来就是要算法和数据都要对路的情况下才行!
40 楼 kissau 2008-10-30  
superloafer 写道
jemmywang 写道
ls的,现在是选前5最快的。
如果D组第一是第一梯队最慢的(第5),那D组从第2名以后怎么也不可能挤入前5了;


注意题目,是问至少:
答案是7场,下面是我的表述:

前5场的比赛以后取每组第一进行比赛(第6场),排名如下所示:

1    2    3    4    5

a    e    j    o    t
b    f    k    p    u
c    g    l    q    v
d    h    m    r    w
e    i    n    s    x

在第6场中排名第5的那组,从第2名以下 无法进入前5,同理可知,第4名那一组自第3名以下无法进入前5.。。。。,如下:

1    2    3    4    5

a    e    j    o    t
b    f    k    p    X
c    g    l    X    X
d    h    X    X    X
e    X    X    X    X

第7场,取第6场的第5名与  第6场的前4名所在的组的第2名进行比赛,如果这些第2名都比第6场第5名慢,那么第6场第5名就是前5的最后一个,前5名就诞生了。 (题目的至少到这里就得到了解答。

如果不满足这种情况,则淘汰比第6场第5名还慢的那组自第2名开始的所有马,剩下的情况就比较简单了,看着也知道10场绝对能得到最快的5匹。

我觉得你的是对的,我前面也说过这样排除那些不需要比赛的,但是得出的结果是八场。但是这道题目说的是至少,所以如果能找到一种比赛组合可能七场就能确定的话,那应该就是七场了。我没有抓住题目的要旨,即“至少”。就好比一个排序算法一样,拿插入排序为例,如果问插入排序至少要比较多少次才能确定它是有序的,答案是n,当所有的数据本来都是顺序排列的时候;当问至多要比多少才能确定呢,答案是(n-1)n/2次,即所有的数据都是逆序的。

你的第一步是对的,但第二步却有点问题,太过理想化,如果按你的思想,拿某一轮的第五和其他4轮的第一比,如果第五跑第一,那么结果是6场,所以这种算法肯定是错误的。
应该拿每组的第二名比赛
a    e    j    o    t   1(根据第六轮分析)
b    f    k    X    X   2(因为e,b比f快,所以a比f快,所以f后面至多一个,为k)
c    ◎   X    X    X   3(abcef比◎快,所以◎和后面的都淘汰)
d    X    X    X    X   4(同上)
e    X    X    X    X   5(同上)
这样根据比赛排名(每组的第二排名),
可以淘汰如上X
然后拿j,f,c,d,e比赛
无论排名如何都能得出结果(自己分析)
至少7场
39 楼 superloafer 2008-10-30  
jemmywang 写道
ls的,现在是选前5最快的。
如果D组第一是第一梯队最慢的(第5),那D组从第2名以后怎么也不可能挤入前5了;


注意题目,是问至少:
答案是7场,下面是我的表述:

前5场的比赛以后取每组第一进行比赛(第6场),排名如下所示:

1    2    3    4    5

a    e    j    o    t
b    f    k    p    u
c    g    l    q    v
d    h    m    r    w
e    i    n    s    x

在第6场中排名第5的那组,从第2名以下 无法进入前5,同理可知,第4名那一组自第3名以下无法进入前5.。。。。,如下:

1    2    3    4    5

a    e    j    o    t
b    f    k    p    X
c    g    l    X    X
d    h    X    X    X
e    X    X    X    X

第7场,取第6场的第5名与  第6场的前4名所在的组的第2名进行比赛,如果这些第2名都比第6场第5名慢,那么第6场第5名就是前5的最后一个,前5名就诞生了。 (题目的至少到这里就得到了解答。

如果不满足这种情况,则淘汰比第6场第5名还慢的那组自第2名开始的所有马,剩下的情况就比较简单了,看着也知道10场绝对能得到最快的5匹。

我觉得你的是对的,我前面也说过这样排除那些不需要比赛的,但是得出的结果是八场。但是这道题目说的是至少,所以如果能找到一种比赛组合可能七场就能确定的话,那应该就是七场了。我没有抓住题目的要旨,即“至少”。就好比一个排序算法一样,拿插入排序为例,如果问插入排序至少要比较多少次才能确定它是有序的,答案是n,当所有的数据本来都是顺序排列的时候;当问至多要比多少才能确定呢,答案是(n-1)n/2次,即所有的数据都是逆序的。
38 楼 jemmywang 2008-10-30  
ls的,现在是选前5最快的。
如果D组第一是第一梯队最慢的(第5),那D组从第2名以后怎么也不可能挤入前5了;


注意题目,是问至少:
答案是7场,下面是我的表述:

前5场的比赛以后取每组第一进行比赛(第6场),排名如下所示:

1    2    3    4    5

a    e    j    o    t
b    f    k    p    u
c    g    l    q    v
d    h    m    r    w
e    i    n    s    x

在第6场中排名第5的那组,从第2名以下 无法进入前5,同理可知,第4名那一组自第3名以下无法进入前5.。。。。,如下:

1    2    3    4    5

a    e    j    o    t
b    f    k    p    X
c    g    l    X    X
d    h    X    X    X
e    X    X    X    X

第7场,取第6场的第5名与  第6场的前4名所在的组的第2名进行比赛,如果这些第2名都比第6场第5名慢,那么第6场第5名就是前5的最后一个,前5名就诞生了。 (题目的至少到这里就得到了解答。

如果不满足这种情况,则淘汰比第6场第5名还慢的那组自第2名开始的所有马,剩下的情况就比较简单了,看着也知道10场绝对能得到最快的5匹。
37 楼 ak_2005 2008-10-30  
恩 根据我的想法(就是某组第一剔除了,后面补上) 就是10场能决出最快的5匹马(绝对保证正确)
但是就是不知道是不是最小值了
36 楼 armorking 2008-10-30  
先把马分成5组,每组5匹

第1场到第5场分别决出每组第一
第6场对每组的第一名进行比赛
根据结果,假定第六场的5匹马是
a1 > b1 > c1 > d1 > e1
a1所在的组的5匹马是a1 > a2 > a3 > a4 > a5
b1所在的组的5匹马是b1 > b2 > b3 > b4 > b5
c1所在的组的5匹马是c1 > c2 > c3 > c4 > c5
d1所在的组的5匹马是d1 > d2 > d3 > d4 > d5
e1所在的组的5匹马是e1 > e2 > e3 > e4 > e5

显然a1是第1名

第7场,将a1剔除出去,把a2换进来,与b1,c1,d1,e1进行比赛
因为比赛仍然是在每组最快的马之间进行的(a1已经排除在外了)
这场比赛的胜者就是除了a1之外最快的马,即第2名

第8场,先将第7场胜者(第2名)剔除出去
将第7场胜者所在组的下一匹马与参与第7场比赛的剩下4匹马进行比赛
显然比赛仍然是在每组最快的马之间进行的
所以,这场比赛的胜者就是第3名

依次下去,到了第10场比赛就可以决出第5名了

以上说明的是,最少要10场就一定能决出前5名
至于这个10是不是最小值,我无法证明
35 楼 ak_2005 2008-10-30  
这里需要搞清楚一个事 25匹马分成A B C D E 5个组
前面5场决出 每组 第一

第6场让每组第一名决出高下

假设A组的的第一最快 D组第一最慢
但是能保证A组第二(该组第一和第二差距很大)就一定比D组(该组第一和第二差距很小)第二快吗???(而第6场差距也很微弱)

更极端的是某个组的5匹马就是跑的最快的那5匹。。。
34 楼 lipengyu2006 2008-10-30  
第二个是不是(N/M+1)*Y-1
33 楼 lipengyu2006 2008-10-30  
我觉得应该是29场

每六场能决定一匹马

最后一次是五场

6+6+6+6+5=29
32 楼 20024804 2008-10-30  
最多9场
前面5场就不说了
第2,3明只需比一场就可以决出,其他的每选出一名都需要比一场

特殊情况下,运气好的话,7场,8场都有可能
31 楼 ganqing1234 2008-10-30  
楼上的当然有问题,我觉得还是10场
30 楼 baseline 2008-10-30  
yuyoo4j 写道
是7场;
前面5场,让所有的马跑一次;
标记每场的第一名为: A,B,C,D,E; 标记此5匹马为 first梯队
标记每场的第二名为: a,b,c,d,e; 标记此5匹马为 second梯队
第6场, 让 second梯队 跑一次; 标记 顺序为 1,2,3,4,5;
第7场, 让 第6场中跑第1,3,5名的马对应在  first梯队 和 第2,4名在second梯队跑一次
就可以最终确定 前5名马了.



我怎么觉得是8场,,前面的你说的是对的。
前面5场,所有的马跑一次。得到每场最快的马(第一梯队)和第二快的马(第二梯队)。
第6场,最快的5匹马(第一梯队)跑一次。标记为a,b,c,d,e
第7场,第二快的马(第二梯队)跑一次。得到的其中最快的马,标记为f。f就第二梯队里最快的了。
第8场,不用a在参加了,因为a就是最快的马了。让b,c,d,e,f跑一次,淘汰最后的一名。然后把a在加到里面,得到的就是最快的了。

有没问题?
29 楼 ThinkInJava 2008-10-30  
没什么说的了,就是10场了,上面已经有人说过了,是正确的了!
28 楼 heroicq 2008-10-30  
既然都很稳定,拿个秒表计算,看时间,只要比五场就知道结果了!!
哈哈。。。大家不要扔砖头。。。
27 楼 superloafer 2008-10-29  
思考了一下这个问题,发现一个规律就是:从第六场决出每队最快的马之后的每一场比赛中,跑得越前的马都给它原来所在队的队员留下了更广阔的空间,而同时也让其他的某些队员无缘下一轮比赛。比如说第六场,甲1跑了第一,那么给甲2,甲3,甲4,甲5留下了广阔的发展空间,它们都有可能有能力得的2,3,4,5名,他们四个当中至少要有一个上过场,否则就算接下来比了N场,他们没上场都不能定音。所以最快决出前五名的马的规则就是要让每场跑第一名的马所属的那队其他马先上。它在比赛中所获的名次,决定其后面兄弟的命运。比如甲2,甲3在第七场分别跑了第四第五,甲队是不用再比赛了,甲2,甲3跑的成绩好一点,那么给甲4,甲5留下了余地,也淘汰了一些其他队的一些队员。
26 楼 superloafer 2008-10-29  
这个答案我早已经承认错误了啊,呵呵!看来目前离google的距离还挺远,平时要多看看这类题目,多多锻炼算法和思维。
25 楼 ailu5949 2008-10-29  
superloafer 写道

M6正好跑了第一名,第七场就能出结果了,前五名就是在第六场比赛的五匹马;


我觉得这样不对~。
如果是以下情况怎么办?(数字代表马的速度)
第一场:25 9 8 6 5
第二场:17 12 13 7 4
第三场:24 14 15 16 22
第四场:23 18 19 20 21
第五场:11 10 3 2 1

这样最快的是 21 22 23 24 25  可是按LZ所说的  那就是 23 24 25 11 17
24 楼 xingqiliudehuanghun 2008-10-29  
感觉最少需要6+1+4场比赛,前5场找出每组中的最快的,第六场找出选拔出来的最慢的,剩下的四场和余下的四对比证明自己最快
23 楼 superloafer 2008-10-29  
第六场: 甲1 乙1 丙1 丁1 戊1  每队队员分别称为甲1,甲2,。。。乙1,乙2.。。。丙1,丙2。。。。。 甲1为No1选出
甲2-甲5 4名队员:可能争夺的名次:2 3,4,5,
乙2-乙4 3名队员:可能争夺的名次:  3,4,5,
丙2-丙3 2名队员:可能争夺的名次:     4,5,
丁2:   1名队员:可能争夺的名次:        5,
戊:          其他四名被淘汰;

除甲1(已选出),加上乙1,丙1,丁1,戊1,共剩下14匹马仍需比赛

第七场: 乙1 甲2(争第二名,因为只有甲2有实力和乙1抗衡) 丙1 甲3 乙2(争第三名)
若比赛结果为:
甲2 第二,甲3第三(也就是第七场比赛的第一第二名,是整体第二第三名)
那么乙3,乙4,丁1,丁2,戊1被淘汰(被甲2,甲3挤掉)
        甲队仍需比赛队员::甲4,甲5,
乙队仍需比赛队员:  乙1,乙2,
        丙队人需比赛队员:  丙1        
        共5名队员仍需参加比赛
因为只剩下5名需要再参加比赛的马了,所以最多只要再赛第八场就可出结果了。取第八场的前两名,再加上前面已赛出来的甲1,甲2,甲3,便可选出整体的前五名。

还有其他情况,不过场次应该都要更多或相等的吧。

相关推荐

    微软、谷歌、百度、腾讯,阿里等各大公司笔试面试题整理

    这份名为“微软、谷歌、百度、腾讯,阿里等各大公司笔试面试题整理”的资源集合了全球顶级科技公司,包括微软、谷歌、百度、腾讯和阿里巴巴等,在招聘过程中的笔试和面试题目,对于软件程序员和求职者来说是极其宝贵...

    2014年十月BAT,华为小米搜狗,谷歌等各大IT公司最新面试题及答案

    7. **谷歌面试题**: 谷歌作为全球领先的互联网科技公司,面试题可能涵盖人工智能、大数据、分布式系统。面试者可能会被问到如何改进Google Maps的路线规划,或者设计一个大规模机器学习模型。 这些公司的面试题...

    微软等数据结构 算法面试100题全部答案集锦

    最后,文档的内容中提到了一个特定的个人或事件,即一个名为Julian的个人在名为CSDN的网站上开启了一个关于面试的讨论,并且在2019年10月23日发布了完整的答案集。这一点表明文档可能包含了社区讨论和互动的元素,...

    算法与数据结构笔记+leetcode刷题笔记+大厂面试算法题(golang和java实现).zip

    LeetCode是一个在线平台,提供了大量的编程题目,主要涵盖算法和数据结构。通过刷LeetCode题目,开发者可以提升算法技能,同时熟悉面试中可能遇到的问题。LeetCode的题目难度从简单到困难,适合不同水平的学习者。...

    微软、谷歌、百度、腾讯等各大公司笔试面试题整理全版

    谷歌的面试题往往强调算法和问题解决能力,例如,你可能需要解决一个涉及动态规划或图论的实际问题。此外,谷歌还会测试你的系统设计能力,如设计一个大规模分布式系统,或者如何处理高并发场景。对于软件工程师来说...

    很多大牛公司的面试题

    14. **编程规范与最佳实践**:遵循良好的编程习惯,了解Java编码规范,以及如何写出可读性高、可维护的代码,是评判一个优秀程序员的标准之一。 这些知识点只是冰山一角,实际面试中,面试官还会根据候选人的经验和...

    课程流_微软、谷歌、百度、腾讯等各大公司笔试面试题整理全版.

    课程流_微软、谷歌、百度、...如今,又即将迈入求职高峰期--10 月份,所以,也不免关注了 网上和我个人建的算法群 Algorithms1-12 群内朋友发布和讨论的最新面试题。特此整理, 以飨诸位。至于答案,望诸位共同讨论与思考。

    如何进入Google工作? Google的面试题和招聘流程介绍(2) .txt

    ”以及“Google的面试题和招聘流程介绍”,这表明文章将深入探讨Google的招聘策略、面试过程及应聘者需具备的关键技能。以下是对这一主题的详细分析和扩展。 ### Google招聘的核心要素 #### 1. 高标准的筛选机制 ...

    微软、谷歌、百度、腾讯等各大公司笔试面试题整理全版.rar

    这份名为"微软、谷歌、百度、腾讯等各大公司笔试面试题整理全版.rar"的压缩包文件,显然是一个集合了多个知名科技企业招聘过程中常见笔试和面试问题的资源。这其中包括了微软、谷歌、百度和腾讯等在全球范围内极具...

    google面试题(部分)

    - **问题描述**:给定一个字符串,返回一个由单词组成的列表。单词被定义为由一个或多个空格分隔,或被引号包围的字符序列。例如,给定字符串 "Ihavea"fauxcoat"" 应返回列表 [I, have, a, fauxcoat]。 - **知识点**...

    源码实例go语言算法面试刷题1047个含解析

    算法面试是软件行业求职过程中的一个重要环节,通常考察求职者逻辑思维和编程能力。常见的面试题型包括但不限于: 1. 排序算法:例如快速排序、归并排序、堆排序等。 2. 搜索算法:包括深度优先搜索(DFS)、广度优先...

    Google面试/笔试题

    1. **算法与数据结构**:Google笔试题和面试题通常会涉及到基础及高级的算法,如排序(快速排序、归并排序等)、查找(二分查找、哈希查找等)以及复杂的数据结构,如链表、栈、队列、树(二叉树、平衡树如AVL和红黑...

    IT公司笔试面试题集合

    其次,"笔试面试题"这个文件可能涵盖了多种技术领域,不仅限于Java,也可能包括C++、Python、数据结构、算法等。在笔试环节,常见的题目类型有编程题,要求编写代码解决特定问题;还有选择题和填空题,考察对各种...

    google北电百度华为腾讯试题及面试

    至于北电(Nortel Networks),虽然该公司已经不存在,但其历史上的面试题仍具有参考价值,尤其是在电信和网络技术领域。面试可能涉及到通信协议、网络架构和系统设计等。 中兴通讯的面试题可能包括通信协议、软件...

    IT名企面试题(microsoft, google, yahoo等)

    这些公司的面试题不仅考察候选人的技术能力,还包括逻辑思维、问题解决和创新能力。以下将详细探讨这些IT名企面试题所涉及的知识点。 1. **算法与数据结构**: - Microsoft、Google和Yahoo的面试中,数据结构和...

    整理的Android开发、Java、数据结构与算法、计算机网络和操作系统等面试题.zip

    在IT行业中,尤其是在软件开发领域,面试通常会涵盖多个关键领域的知识,包括但不...在"Android-Interview-master"这个压缩包中,可能包含了上述各领域的面试题集和解答,这对于准备面试的开发者来说是一份宝贵的资源。

    程序员面试笔试算法与数据结构geeksforgeeks

    《程序员面试笔试算法与数据结构...总的来说,这份资料为准备面试的程序员提供了一个全面的算法和数据结构学习路径。通过系统学习,你可以增强自己的编程基础,提升面试竞争力,为未来的事业发展奠定坚实的基础。

    校园招聘面试题面经汇总——华为,中兴,腾讯,迅雷,智力题,以及一些外企

    例如,可能会让你找出一个数字序列的规律,或者设计一个能容纳最多鸡蛋的最优摔落策略。 对于外企,如Google、Microsoft等,面试通常更加注重基础扎实、算法熟练和问题解决能力。他们喜欢用白板编程来测试面试者在...

Global site tag (gtag.js) - Google Analytics