阿里巴巴历年笔试面试70题


1、澳大利亚的父母喜欢女孩,如果生出来的第一个女孩,就不再生了,如果是男孩就继续生,直到生到第一个女孩为止,问若干年后,男女的比例是多少?

2、3点15的时针和分针的夹角是多少度。

3、有8瓶水,其中有一瓶有毒,最少尝试几次可以找出来?

4、 给一篇文章,里面是由一个个单词组成,单词中间空格隔开,再给一个字符串指针数组,比如 char *str[]={"hello","world","good"};求文章中包含这个字符串指针数组的最小子串。注意,只要包含即可,没有顺序要求

5、有无序的实数列V[N],要求求里面大小相邻的实数的差的最大值,关键是要求线性空间和线性时间。

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

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

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


11、死锁的条件。(互斥条件(Mutual exclusion):1、资源不能被共享,只能由一个进程使用。2、请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。3、非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。4、循环等待条件(Circular wait):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。处理死锁的策略:1.忽略该问题。例如鸵鸟算法,该算法可以应用在极少发生死锁的的情况下。为什么叫鸵鸟算法呢,因为传说中鸵鸟看到危险就把头埋在地底下,可能鸵鸟觉得看不到危险也就没危险了吧。跟掩耳盗铃有点像。2.检测死锁并且恢复。3.仔细地对资源进行动态分配,以避免死锁。4.通过破除死锁四个必要条件之一,来防止死锁产生。)

12、一个树被序列化为数组,如何反序列化。

13、如何将100百万有序数据最快插入到STL的map里。

14、有两个线程a、b分别往一条队列push和pop数据,在没有锁和信号量的情况下如何避免冲突访问。

15、写一个函数,功能是从字符串s中查找出子串t,并将t从s中删除。

16、有101根电线 每根的一头在楼底  另一端在楼顶  有一个灯泡 一个电池 无数根很短的电线  怎么样在楼上一次在楼下去一次将电线的对应关系弄清楚。

17、汉诺塔一共为 2*N,2个一样大小,有编号顺序 每次只能移动一个 大的不能叠在小得上面 移动完之后,相同大小的编号必须和原来一样 问最小要移动多少次? 如 A1 A2  B1 B2 C1 C2 ...... 这样叠,A<B<C....   B不能放A上面,C不能放B A上面,移动到另外一个柱子后,还必须是 A1 A2  B1 B2 C1 C2 ....

18、9月6日,阿里笔试题:平面上有很多点,点与点之间有可能有连线,求这个图里环的数目。

19、搜索引擎中5亿个url怎么高效存储。

20、对于给定的整数集合S,求出最大的d,使得a+b+c=d。a,b,c,d互不相同,且都属于S。集合的元素个数小于等于2000个,元素的取值范围在[-2^28,2^28 - 1],假定可用内存空间为100MB,硬盘使用空间无限大,试分析时间和空间复杂度,找出最快的解决方法。
点评:
@绿色夹克衫:两两相加转为多项式乘法,比如(1 2 4 6) + (2 3 4 5) => (x + x^2 + x^4 + x^6)*(x^2 + x^3 + x^4 + x^5) 。更多思路请见这:http://www.51nod.com/answer/in ... 3D569
21、原题大致描述有一大批数据,百万级别的。数据项内容是:用户ID、科目ABC各自的成绩。其中用户ID为0~1000万之间,且是连续的,可以唯一标识一条记录。科目ABC成绩均在0~100之间。有两块磁盘,空间大小均为512M,内存空间64M。
1). 为实现快速查询某用户ID对应的各科成绩,问磁盘文件及内存该如何组织;
2). 改变题目条件,ID为0~10亿之间,且不连续。问磁盘文件及内存该如何组织;
3) . 在问题2的基础上,增加一个需求。在查询各科成绩的同时,获取该用户的排名,问磁盘文件及内存该如何组织。

22、代码实现计算字符串的相似度。
点评:和计算两字符串的最长公共子序列相似。
设Ai为字符串A(a1a2a3 … am)的前i个字符(即为a1,a2,a3 … ai)
设Bj为字符串B(b1b2b3 … bn)的前j个字符(即为b1,b2,b3 … bj)
设 L(i , j)为使两个字符串和Ai和Bj相等的最小操作次数。
当ai等于bj时 显然L(i, j)=L(i-1, j-1)
当ai不等于bj时
  若将它们修改为相等,则对两个字符串至少还要操作L(i-1, j-1)次
  若删除ai或在Bj后添加ai,则对两个字符串至少还要操作L(i-1, j)次
  若删除bj或在Ai后添加bj,则对两个字符串至少还要操作L(i, j-1)次
  此时L(i, j)=min( L(i-1, j-1), L(i-1, j), L(i, j-1) )  + 1
显然,L(i, 0)=i,L(0, j)=j, 再利用上述的递推公式,可以直接计算出L(i, j)值。具体代码请见这:http://blog.csdn.net/flyinghea ... 05996。 

23、某二叉树的前序遍历序列为-+a*b-cd/ef,后序遍历序列为abcd-*+ef/-,问其中序遍历序列是什么?
解答如下图所示:

222.jpg


24、某虚拟内存系统采用LRU算法的页式内存管理,考虑下面页面访问地址流(每次访问在一个时间单位内完成):
1,8,1,7,8,2,7,2,1,8,3,8,2,1,3,1,7,1,3,7
假定内存容量为4个页面,开始是空的,则页面失效的次数为____。

333.jpg


25、甲包8个红球 2个蓝球,乙包2个红球 8个蓝球。抛硬币决定从哪个包取球,取了11次,7红4蓝。注,每次取后还放进去,只抛一次硬币。问选的是甲包的概率?
点评:贝叶斯公式 + 全概率公式作答(参看链接:http://www.doc88.com/p-132711202556.html)。具体解答如下图所示:

555.jpg


26、已知一个n个元素的数组,第i个元素在排序后的位置在[i-k,i+k]区间,k<<n .让你设计一个算法对数组排序,要求时间复杂度最小,O (nlogn)不得分,O(nk)得2分。

27、有一个序列seq=[a,b,c,d,aa,ba,ca,da,ab,bb,cb,db,ac,bc,cc,dc,...,aaa,baa,caa,...]。其中第1个字符串是a。请问(1)aaa是seq中第几个字符串?(2)ababacd是seq中第几个字符串?(3)seq中第1000个字符串是什么?(4)编程实现find函数“输入一个子串,返回所在位置”,编程语言不限。

28、 有一个怪物流落到一个荒岛上,荒岛上有n条鳄鱼。每条鳄鱼都有实力单独吃掉怪物。但是吃掉怪物是有风险的,会造成体力值下降,然后会有可能被掉其他鳄鱼吃。问,最后那个怪物是危险的还是安全的?

29、A[i]是一个有序递增数组,其中所有的数字都不相等,请设计一种算法,求出其中所有的A[i]=i的数字并分析时间复杂度,不分析复杂度不得分。

30、你在浏览器中输入网址:http://blog.csdn.net/v_JULY_v,按下回车键后,会发生什么事情,请一一描述。包括浏览器,网络,服务器等等发生的事情,及各项关键技术。
点评:这样的题考过很多次,参考答案如下图所示:

666.jpg


31、一个有10亿条记录的文本文件,已按照关键字排好序存储。请设计算法,可以快速的从文件中查找指字关键字的记录。

32、在互联网时代,系统的稳定性要求越来越高,为了提升系统的稳定性,高科技技术被广泛运用,请列举至少4种相关的技术解决硬件,系统或网络等层面的单点问题。

33、请描述一下TCP建立连接的三次握手过程。

34、搜索引擎是很常用的web应用,大部分搜索引擎需要设计一个爬虫(crawer),从很多网站榨取页面,分析数据,供搜索引擎使用。设想你来做一个搜索引擎的爬虫,需要抓取约一百万家网站的网页内容。
1)、请画一个爬虫系统的架构图;
2)、重点说明你的爬虫需要如何优化来提升性能。

35、设计一个最优算法来查找一n个元素数组中的最大值和最小值。已知一种需要比较2n次的方法,请给一个更优的算法。请特别注意优化时间复杂度的常数。

36、已知三个升序整数数组a[i],b[m]和c[n]。请在三个数组中各找一个元素,使得组成的三元距离最小。三元组的距离定义是:假设a[1],b[j]和c[k]是一个三元组,那么距离为:distance=max(▏a[i]-b[j]▕,▏a[i]-c[k]▕,▏b[j]-c[k]▕),请设计一求最小三元组距离的最优算法,并分析时间复杂度。

37、在黑板上写下50个数字:1至50。在接下来的49轮操作中,每次做如下动作:选取两个黑板上的数字a和b,擦去,在黑板上写▏b-a▕。请问最后一次动作之后剩下数字可能是什么?为什么?

38、指针/数组区别,决策树训练原理,SVM原理,网络协议,堆排序,字符串转换成整数,设计一款拼音输入法等等..
点评:字符串转换成整数看似简单,实则很多坑,要写好并不容易,具体分析和实现见编程艺术第30章:http://blog.csdn.net/v_july_v/ ... 24123;决策树见:http://blog.csdn.net/v_july_v/ ... 77684;SVM原理见:http://blog.csdn.net/v_july_v/ ... 24837
总结:此次面试的这位同学面的还是堆排/快排/atoi等典型问题,实际上:①面试看基础算法编程能力,和准备是否充分;②不论结果如何,跟4年前高考一样,高考和面试都只是人生路上的其中一站。你的真正核心竞争力不是进哪所名校哪所名企,而是存在你骨子里的上进心或热爱钻研技术的态度。

39、有三个字段:time(登陆或登出时间点)+uid+login或logout,每条记录按时间顺序排列。问题如下:给定一个时间点T,统计在线人数。 
点评:参考分析请见http://blog.csdn.net/tnndye/ar ... 84237

40、两个字符串A、B。从A中剔除存在于B中的字符。比如A=“hello world”,B="er",那么剔除之后A变为"hllowold"。空间复杂度要求是O(1),时间复杂度越优越好。
点评:微博上一朋友@kanrence留言到:把B对应的字符在asc码表上置1,然后扫描A,表上置1的就A上删掉。或者如@齐士博Go所说asc的bitvector, O(m+n); 先把B映射到vecotr,再遍历A。这两种方法因为都是常数空间127,所以可以认为是空间复杂度O(1),此外,还有别的什么方法么?位运算?更多讨论请见这:http://weibo.com/1580904460/Ae ... otime

41、无限的连续值如何离散化然后储存在已开的数组中。

42、有8只球队,采用抽签的方式随机配对,组成4场比赛。假设其中有3只强队,那么出现强强对话(任意两只强队相遇)的概率为多少。

43、常常会有频繁申请、释放内存的需求,比如在发送网络报文时,每次都要分配内存以存储报文,等报文发送完成后又需要删除报文。
为了避免频繁的new/delete对系统带来的开销,需要实现一个通用的FreeList机制。使用者总是从free list中分配内存,如果存在没有使用的内存块就直接摘出来使用,如果没有的话再从系统中分配。使用完毕后并不去直接delete该内存块,而是交给FreeList保管。
要求:
1). 实现一个对固定大小内存块进行管理的通用FreeList类,给出定义和实现。要求不能使用STL中的容器类。定义类的接口和实现时注意通用性、健壮性和可测试性。
2). 如果该类的对象可能会被多个thread同时访问,请描述如何怎样保证线程安全。有没有办法在保证线程安全的同时尽可能增大并发度?如果有也请描述你的思路。

44、假设这样一个场景:当很多用户并发获取服务,server端资源不足时,希望用户能够按照预先分配的配额来使用资源。
比如预先定义好user1, user2, user3的配额是20%, 30%, 50%,资源争抢时希望服务器有20%的服务能力分配给user1, 30%给user2, 50%给user3。
但是如果某个时刻只有user1的请求,server还是要把100%的服务能力分配给user1以充分利用资源;又如某个时间段只有user2/user3在访问服务,则按照30%:50%的比率来分配资源。

需要通过一个类似于队列的ManagedQueue类来封装上述功能。
入队的时候需要提供user id(32位正整数)以及用户的任务(Task)。我们假设系统的用户数是有上限的,不会超过10个。

当队列中各个用户的请求均非空时,要求出队的task分布符合用户的配额设置。延续上面的例子如果连续出队100次,要求user1的task有20个左右,user2的task 30个左右, user3的50个左右。

这里出队的task恰好能对应服务器的服务能力。

要求:
1). 给出关键数据结构以及ManagedQueue的定义。用户任务Task可以认为是一个已经实现的类来使用。可以使用STL容器类。
2). 实现出队方法Dequeue(),请尽可能写健壮的代码
注意:这里并不要求精确的按照比例分配任务,只要统计意义上满足预定义的配额比例就可以了。

45、分布式系统中的RPC请求经常出现乱序的情况。
写一个算法来将一个乱序的序列保序输出。例如,假设起始序号是1,对于(1, 2, 5, 8, 10, 4, 3, 6, 9, 7)这个序列,输出是:
1
2
3, 4, 5
6
7, 8, 9, 10

上述例子中,3到来的时候会发现4,5已经在了。因此将已经满足顺序的整个序列(3, 4, 5)输出为一行。

要求:
1). 写一个高效的算法完成上述功能,实现要尽可能的健壮、易于维护
2). 为该算法设计并实现单元测试

46、如何保证hash_map的线程安全?并且性能尽可能高效?

47、常常会有频繁申请,释放内存的需求,比如在发送网络报文时,每次都要分配内存以存储报文,等报文发送完成后又需要删除报文。为了避免频繁的new/delete对系统带来的开销,需要实现一个通用的FreeList机制。使用者总是从free list中分配内容,如果存在没有使用的内存块就直接摘出来使用,如果没有的话再从系统中分配,使用完毕后并不缺直接delete该内存块,而是交给FreelList保管。
要求:1)实现一个对固定大小内存块进行管理的通用FreeList类,给出定义和实现,要求不能使用STL中的容器类,定义类的接口和实现时注意通用性、健壮性和可测试性。2)、如果该类对象可能会被多个thread同时访问。请描述如何怎样保证线程安全。有没有办法在保证线程安全的同时尽可能增大并发度?如果有也请描述你的思路。

48、假设这样一个场景:当很多用户并发获取服务,server端资源不足时,希望用户能够按照预先分配的配额来使用资源。比如预先定义好user1,user2,user3的配额是20%、30%、50%,资源争抢时希望服务器有20%的服务能力分配给user1,30%给user2,50%给user3.但是如果某个时刻只有user1的请求,server还是要把100%的服务能力分配给user1以充分利用资源;又如某个时间段只有user2/user3在访问服务,则按照30%:50%的比率来分配资源。需要通过一个类似于队列的ManagedQueue类来封装上述功能。入队的时候需要提供user id(32位正整数)以及用户的任务(task)。我们假设系统的用户数是有上限的,不会超过10个。当队列中各个用户的请求均非空时,要求出队的task分布符合用户的配额设置。延续上面的例子如果连续出队100次,要求user1的task有20个左右,user2的task30个左右,user3的50个左右。这里出队的task恰好能对应服务器的服务能力。
要求:1)、给出关键数据结构以及ManagedQueue的定义。用户任务task可以认为是一个已经实现的类来使用。可以使STL容器类。2)、实现出队方法Dequeue(),请尽可能写健壮的代码。

49、分布式系统中的RPC请求经常出现乱序的情况。
写一个算法来将一个乱序的序列保序输出。例如,假设起始序号是1,对于(1,2,5,8,10,4,3,6,9,7)这个序列,输出是:
1
2
3,4,5
6
7,8,9,10
上述例子中,3到来的时候会发现4,5已经在了,因此将已经满足顺序的整个序列(3,4,5)输出为一行。
要求:1)、写一个高效的算法完成上述功能,实现要尽可能的健壮、易于维护。2)为该算法设计并实现单元测试。

50、输入321,输出"123",要求必须用递归,不能用全局变量,输入必须是一个参数,必须返回字符串。

51、双十一的时候很多人都提前在购物车中收藏了想买的商品,等0点就一键批量下单,假设购物车清单如下:
店铺A
商品A1 1999元 1件
商品A2 20元 1件
店铺B
商品B1 120元 1件
店铺C
商品C1 56元 2件
请编写一键批量下单的主要逻辑代码
0点流量很大,适当考虑性能

52、两个字符串A、B,从A中剔除存在于B中的字符。比如A=“hello world”,B="er",那么剔除之后A变为"hllo wold"。空间复杂度要求是O(1),时间复杂度越优越好。

53、由 + 、x、(、)组成的表达式,求开括号后的表达式
RT
举个例子,(a+b)x(b+c) 这样的字符串,求开括号后的字符串,就是:axb+axc+bxb+bxc。

54、有三个字段:time(登陆或登出时间点)+uid+login或logout,每条记录按时间顺序排列。问题如下:给定一个时间点T,统计在线人数。
如果log超级大,内存放不下又该怎么办?

55、宿舍内5个同学一起玩对战游戏。每场比赛有一些人作为红方,另一些人作为蓝方。请问至少需要多少场比赛,才能使任意两个人之间有一场红方对蓝方和蓝方对红方的比赛?

56、N个鸡蛋放到M个篮子中,篮子不能为空,要满足:对任意不大于N的数量,能用若干个篮子中鸡蛋的和表示。
写出函数,对输入整数N和M,输出所有可能的鸡蛋的放法。
比如对于9个鸡蛋5个篮子
解至少有三组:
1 2 4 1 1
1 2 2 2 2
1 2 3 2 1

57、有一个一亿节点的树,现在已知两个点,找这两个点的共同的祖先。

58、我们有很多瓶无色的液体,其中有一瓶是毒药,其它都是蒸馏水,实验的小白鼠喝了以后会在5分钟后死亡,而喝到蒸馏水的小白鼠则一切正常。现在有5只小白鼠,请问一下,我们用这五只小白鼠,5分钟的时间,能够检测多少瓶液体的成分?
http://topic.csdn.net/u/201109 ... .html(一参考答案)。

59、设计相应的数据结构和算法,尽量高效的统计一片英文文章(总单词数目)里出现的所有英文单词,按照在文章中首次出现的顺序打印输出该单词和它的出现次数。

60、有一棵树(树上结点为字符串或者整数),请写代码将树的结构和数据写到一个文件中,并能通过读取该文件恢复树结构 。

61、两个用户之间可能互相认识,也可能是单向的认识,用什么数据结构来表示?如果一个用户不认识别人,而且别人也不认识他,那么他就是无效节点,如何找出这些无效节点?自定义数据接口并实现之,要求尽可能节约内存和空间复杂度。

62、对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。

63、在现代web服务系统的设计中,为了减轻源站的压力,通常采用分布式缓存技术,其原理如下图所示,前端的分配器将针对不同内容的用户请求分配给不同的缓存服务器向用户提供服务。
               分配器
      /             |         \
缓存         缓存 . ..缓存
服务器1 服务器2 ...服务器n
 1)、请问如何设置分配策略,可以保证充分利用每个缓存服务器的存储空间(每个内容只在一个缓存服务器有副本)
 2)、当部分缓存服务器故障,或是因为系统扩容,导致缓存服务器的数量动态减少或增加时,你的分配策略是否可以保证较小的缓存文件重分配的开销,如果不能,如何改进?
 3)、当各个缓存服务器的存储空间存在差异时(如有4个缓存服务器,存储空间比为4:9:15:7),如何改进你的策略,按照如上的比例将内容调度到缓存服务器?(思路:往memcached或者一致性hash算法方面考虑,但具体情况,具体分析。)

64、文件A:
uid username
文件B:
username password
文件A是按照uid有序排列的,要求有序输出合并后的A,B文件,格式为uid username password(A B 两个文件都很大,内存装不下。)

65、日常最常用的APP是哪个?为什么会觉得好用?如果你在学校做的XX项目,利用这个APP怎么玩?

66、你常用的网购产品有哪些,网购时有没有什么需求没被满足?针对这个需求,并给出解决方案。

67、你最喜欢看的电视娱乐节目是哪个?假如你是这个节目的主编,手机微信和手机淘宝都要找你做深度合作,你会选择哪个,并阐述具体合作方案。
  
68、有人说O2O是把人从线上拉到线下去。也有人说O2O是以我为中心,让服务来找我。请结合市场上真实案例,谈谈你的观点。

69、你做过的最好的和最坏的决定是什么,从中你学到什么?

70、写一个函数,输入一个二叉树,树中每个节点存放了一个整数值,函数返回这棵二叉树 中相差最大的两个节点间的差值绝对值。请注意程序效率。

71、给定一个 query 和一个 text,均由小写字母组成。要求在 text 中找出以同样的顺序连 续出现在 query 中的最长连续字母序列的长度。例如, query 为“acbac”,text 为 “acaccbabb”,那么 text 中的“cba”为最长的连续出现在 query 中的字母序列,因此, 返回结果应该为其长度 3。请注意程序效率。

72、用Java代码模拟实现:一个人不断往箱子里放苹果,另一个人不断从箱子里取苹果,箱子只能放5个苹果,苹果数量无限。要求不使用Java.util.concurrent包中的类。

73、宿舍内5个同学一起玩对战游戏。每场比赛有一些人作为红方,另一些人作为蓝方。请问至少需要多少场比赛,才能使任意两个人之间有一场红方对蓝方和蓝方对红方的比赛?
已邀请:

天悬星河

赞同来自: Alina


我也贡献一道。求10亿个整数的中位数(内存不足以一次放进去)!!!

要回复问题请先登录注册

收藏七月在线,一起向大牛进阶

ctrl+D或command+D可以快速收藏哦~