昨天阿里巴巴研究院的3道题,很有意思,大家讨论下

Aniao 2009-10-24 12:44:42
加精
1. 有无序的实数列V[N],要求求里面大小相邻的实数的差的最大值,关键是要求线性空间和线性时间

2. 25匹赛马,5个跑道,也就是说每次有5匹马可以同时比赛。问最少比赛多少次可以知道跑得最快的5匹马

3. 有一个函数int getNum(),每运行一次可以从一个数组V[N]里面取出一个数,N未知,当数取完的时候,函数返回NULL。现在要求写一个函数int get(),这个函数运行一次可以从V[N]里随机取出一个数,而这个数必须是符合1/N平均分布的,也就是说V[N]里面任意一个数都有1/N的机会被取出,要求空间复杂度为O(1)
...全文
29751 541 打赏 收藏 转发到动态 举报
写回复
用AI写文章
541 条回复
切换为时间正序
请发表友善的回复…
发表回复
smallbaoyu 2012-05-29
  • 打赏
  • 举报
回复
怎么看得分回复。。。回复太多了。。。
hlke85422 2012-05-24
  • 打赏
  • 举报
回复
10次必出
分5组跑取分组第一 5次
5组第一跑 1次 得到最快的
取最快组第二与其他组第一跑 1次
依次类推 取出选出组的下一名 与其他剩下的跑 总能得到第一
这一共需要5次

gangwazi0525 2012-05-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

说说自己的看法:
1-“关键是要求线性空间和线性时间”
先桶排序,桶间距确认方法为随机抽取数列中的m个数,排序x1...xm,以(xm-x1)/2为间距。桶的范围先随意定一个,发现元素超出,就扩展桶
扫描桶,先找出最多个连续不存在元素的桶,然后在这些不存在元素的桶的两边的桶中,进行分析,可找出间距最大的实数
具体能不能达到线性时间就没证明了,抛砖引玉一下,大家有效率更高的方法就提出来吧
……
[/Quote]
第二题是求跑得最快的5匹马,而不是跑的最快的马
谭墨墨快乐 2012-05-19
  • 打赏
  • 举报
回复
第一题具体算法网上都有,可以参考
谭墨墨快乐 2012-05-19
  • 打赏
  • 举报
回复
第一题和最大间隙问题是一样的,基本思路是:
先用线性时间求出max,min。用n-2个等间距点分割区间max和min,产生n-1个桶,每个桶中用high[1]和low[i]分别存储分配给桶i的数中的最大数和最小数。有鸽舍原理可知,至少有一个桶是空的。这意味着最大间隙不会出现在同一桶中的两个数之间。对每一个桶做一次扫描即可找出最大间隙
「已注销」 2012-05-19
  • 打赏
  • 举报
回复
大哥人找的是最快的5匹不是1匹[Quote=引用 4 楼 的回复:]

悲剧啊,就没人看我的回帖吗?
第二题,25匹马,先5个5个分批,分成5批,进行5次比赛,取每次比赛最快的一匹马,则可以得到5匹第一轮最快的马。这5匹马再进行一次比赛,就可以得出哪个是最快的。总共6次

第一题,我提了一个方法,但要证明时间复杂度,得用到概率什么的,比较麻烦,求高手。个人感觉起码是对的,复杂度也是比较低的。
[/Quote]
hnu_0720 2012-05-18
  • 打赏
  • 举报
回复
第一题真的好难做到线性的时间,NLOGN我觉可能性还是大一点
天涯倦客 2012-05-07
  • 打赏
  • 举报
回复
第3题
全部取完 必然是全排列中的一个。
先对 全排列进行编号
然后随即一个编号。
逻辑思维C 2012-05-07
  • 打赏
  • 举报
回复
25匹马分组
最理想状态为:5匹跑的最快的被分到不同的组,分别跑5次取得每组第一。每组第一再跑1次,取跑的最慢的那一只。最慢的一只和其他四组第二再跑1次。 5+1+1 = 7次
最糟糕的状态为:5匹跑的最快的被分到一组了。
LoveYouSelf 2012-05-05
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 的回复:]
第二题以前看过类似的(用秒表当然5次就行,但估计不符合要求),6次应该不能保证排出来,用类似堆排的方法,8次应该可以。
[/Quote]

我倒是觉得不一定是不符合要求,纵观所有CSDN的回帖都没有几个人想到用秒表,说明大家的思维都产生了定势,我想企业需要的不是一些定势的思维,而是要一些创新的想法,不容易被人发掘的做法!

这是鄙人拙见!
gfzeng 2012-05-05
  • 打赏
  • 举报
回复
[Quote=引用 528 楼 的回复:]

申明: (帖子太多, 没有看完, 目前没有看到对第二题很好的回答, 如有雷同, 算我抄你.)

这不是程序题 ----- 个人认为.

先不说解答, 如果这个问题是 70(或任意) 匹马, 其他条件不变. 该如何了?

解答:
要求最快的, 那么要淘汰 24 匹. 每一次淘汰 4 匹, 淘汰 24 匹就比 6 次.
70匹, 那么就是 [69 / 4] + 1 = 18
……
[/Quote]

哈哈, 请原谅, 看错题目了
gfzeng 2012-05-05
  • 打赏
  • 举报
回复
申明: (帖子太多, 没有看完, 目前没有看到对第二题很好的回答, 如有雷同, 算我抄你.)

这不是程序题 ----- 个人认为.

先不说解答, 如果这个问题是 70(或任意) 匹马, 其他条件不变. 该如何了?

解答:
要求最快的, 那么要淘汰 24 匹. 每一次淘汰 4 匹, 淘汰 24 匹就比 6 次.
70匹, 那么就是 [69 / 4] + 1 = 18
任意, 我不用说了吧............
非兔子_Logic0 2012-04-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

2. 5次——掐秒表啊!!!!!!!!!
[/Quote]

我就是来看你的回复的,哈哈
wxy845662068 2012-03-31
  • 打赏
  • 举报
回复
第二题:
8次,先把马分为5组,然后记住他们的排名,然后后用五组的第一名比赛,取得总的第一名,然后用剩下的4匹马和取得第一名的马的那组的第二名一起比赛取的总的第二名,然后用剩下的4马和取得总的第二名的那组马的后一名比赛取得总的第三名(注:马的速度是固定)一共是8次比赛出来前三名。
a1,a2,a3,a4,a5
b1,b2,b3,b4,b5
c1,c2,c3,c4,c5
d1,d2,d3,d4,d5
e1,e2,e3,e4,e4
这5次比赛排出每一马在组中的顺序,a1代表a组中的第一名,a2代表a组中的第二名。。。。。
然后a1,b1,c1,d1,e1比赛得出总的第一名假设位a1
然后b1,c1,d1,e1,a2比赛得出总的第二名假设为b1;
然后c1,d1,e1,a2,b2比赛得出总的第三名
一共8次比赛
codesnail 2011-10-08
  • 打赏
  • 举报
回复
真是不明白,难道这些所谓的大公司都在搞算法,深表怀疑。。。
bellbird 2011-09-30
  • 打赏
  • 举报
回复
[Quote=引用 504 楼 superdullwolf 的回复:]

哈哈,跑马的问题,我画图发现,的确是六次!~~
[/Quote]
六次是不可能的,证明如下:
25匹马中的5匹最快的有C(25,5)=53130种可能
有5个跑道,最少需要跑Log[5,53130]=6.76次,向上取整,因此最少也需要7次
bellbird 2011-09-30
  • 打赏
  • 举报
回复
[Quote=引用 504 楼 superdullwolf 的回复:]

哈哈,跑马的问题,我画图发现,的确是六次!~~
[/Quote]
六次是不可能的,证明如下:
25匹马中的5匹最快的有C(25,5)=53130种可能
有5个跑道,最少需要跑Log[5,53130]=6.76次,向上取整,因此最少也需要7次
bellbird 2011-09-30
  • 打赏
  • 举报
回复
[Quote=引用 504 楼 superdullwolf 的回复:]

哈哈,跑马的问题,我画图发现,的确是六次!~~
[/Quote]
六次是不可能的,证明如下:
25匹马中的5匹最快的有C(25,5)=53130种可能
有5个跑道,最少需要跑Log[5,53130]=6.76次,向上取整,因此最少也需要7次
liuxiaodongxiao 2011-09-30
  • 打赏
  • 举报
回复
[Quote=引用 521 楼 bellbird 的回复:]

引用 504 楼 superdullwolf 的回复:

哈哈,跑马的问题,我画图发现,的确是六次!~~

六次是不可能的,证明如下:
25匹马中的5匹最快的有C(25,5)=53130种可能
有5个跑道,最少需要跑Log[5,53130]=6.76次,向上取整,因此最少也需要7次
[/Quote]
对的,比较排序的最低复杂度为log(排列出现的可能次数)。在这儿就是C(25,5)。
liuxiaodongxiao 2011-09-30
  • 打赏
  • 举报
回复
第一题
将正数交换到前半部分,负数到后半部分。
对正数和负数分别使用基数排序。

基数排序具体步骤为:
先对尾数进行基数排序,再对指数进行基数排序。

时间和空间复杂度都为线性。

第二题
至多9次
分成五组分别赛跑,每组头名再进行比赛,六次赛跑后,循序排列,写出矩阵:
A1 A2 A3 A4 A5
B1 B2 B3 B4 B5
C1 C2 C3 C4 C5
D1 D2 D3 D4 D5
E1 E2 E3 E4 E5
此时可以淘汰掉10匹马了,对角线下面的都有至少五匹-马比他们快,例如C4有C3 C2 C1 B1 A1比它快
A1 A2 A3 A4 A5
B1 B2 B3 B4
C1 C2 C3
D1 D2
E1
此时选取 A4,B3 C2 D1以及B1进行比赛,A4 B3 C2 D1这四匹马中只有跑的最快的不会被淘汰否则,就会有至少五匹马比他们快,可以对着矩阵算一下。若是这四匹马中D1跑的最快,将会有6匹马被淘汰,那么就剩下9匹马。若不是D1跑的最快,则会有七匹马被淘汰,剩下8匹马。另外,很显然五匹马中B1比B3 C2 D1都要快,所以小组头名从A4与B1中产生。若A4跑过了B1,很漂亮,A1,A2,A3,A4包揽了前四,B1与A5来争夺第五名。若A4没跑过B1,也不错,A1,B2为一二名,则剩下7(9-2)匹马或6匹(8-2)来争夺第三四五名。到这儿总共用了7次赛跑。最多再进行两次就可以得出结果了。
加载更多回复(515)

33,007

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧