阿里巴巴历年笔试面试70题 [6-10]

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

将马分成A、B、C、D、E五组。
第1-5次比赛:各组分别进行比赛,决出各组名次
A1、A2、A3、A4、A5,
B1、B2、B3、B4、B5,
。。。。
。。。。。。E4、E5。
第6次比赛:A1、B1、C1、D1、E1,
第一名是跑的最快的。
第7次比赛:将上次第一名所在组的下一号马再和剩余的4匹1号马比赛,
第一名是跑的第二快的马,由于只有4个名额,所以跑的最慢的马和所在组剩余的马全部被淘汰。
第8次比赛:将上次第一名所在组的下一号马、上次第二名所在组的下一号马和剩余的3匹马比赛,
第一名是跑的第三快的马,由于只有3个名额,所以跑的最慢的两匹马和所在组剩余的马全部被淘汰。
在剩下的比赛中分别淘汰慢的,将排名稍后的加进来比赛,最多跑到第10次就可以选出最快的5匹马。如果在某一次比赛中排名前几的是同一组的且和已经选出的马加一起大于等于5,就可以提前决出前5名。
所以8-10次就可以选出最快的5匹马。


7、有一个函数int getNum(),每运行一次可以从一个数组V[N]里面取出一个数,N未知,当数取完的时候,函数返回NULL。现在要求写一个函数int get(),这个函数运行一次可以从V[N]里随机取出一个数,而这个数必须是符合1/N平均分布的,也就是说V[N]里面任意一个数都有1/N的机会被取出,要求空间复杂度为O(1)。

from: http://www.csdn123.com/html/blogs/20130910/67362.htm

解法:设置一个整形num,用来存放get()返回的数。调用getNum()V[N]取数,按一定概率存入num中(覆盖以前的),直到getNum()返回NULL。getNum取的第i个数为numinumi存入num中的概率为Pi。设Pi=1/i ( i已知时,所以这个概率很容易做到)numi保留,并最后返回的情况是,numi被存入num中,且numj(i<j<=N)不被存入num。其概率为:P(numi)=Pi*(1- Pi+1) * (1 - Pi+2)* ...(1 - PN)=1/i * (i/(i+1)) * ((i+1)/(i+20)*....((N-1)/N) = 1/N。

int GetRand()
{
    int i=1;
    int nRet = 0;
    int nVal = 0;
    while((nRet=getNum())!=NULL)
    {
        if(rand()%(i++)==0) nVal = nRet;
    }
    return nVal;
}

8、给定一段产品的英文描述,包含M个英文字母,每个英文单词以空格分隔,无其他标点符号;再给定N个英文单词关键字,请说明思路并编程实现方法
    String extractSummary(String description,String[] key words)
目标是找出此产品描述中包含N个关键字(每个关键词至少出现一次)的长度最短的子串,作为产品简介输出。(不限编程语言)。
点评:扫描过程始终保持一个[left,right]的range,初始化确保[left,right]的range里包含所有关键字则停止。然后每次迭代:
1). 试图右移动left,停止条件为再移动将导致无法包含所有关键字。
2). 比较当前range's length和best length,更新最优值。
3). 右移right,停止条件为使任意一个关键字的计数+1。
4). 重复迭代。
编程之美有最短摘要生成的问题,与此问题类似,读者可作参考。

9、一个HTTP服务器处理一次请求需要500毫秒,请问这个服务器如何每秒处理100个请求。

多线程?


10、三次握手

111.jpg
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值