本系列源于:从July的470道面试题中提取阿里的笔试题和面试题,以助应聘阿里的同学和朋友们一臂之力。题目中也含有淘宝、UC、支付宝的部分,大家都知道,毕竟这几个是一家。
这部分题目大多在2011~2013年左右,近两年的阿里面试笔试题还没有,希望有的朋友能直接发我邮箱:[email protected],或者直接微信我HyperHorse,当然也可以直接在我的blog下面进行评论。当然其他互联网公司,如百度、网易、腾讯、360等等公司的笔试面试题也可以发到有的邮箱[email protected]中,我会在其他专栏中开辟对每个互联网公司面试题的专栏进行分析和整理。
凡是收集到的关于阿里的题目均会在本Blog进行更新,希望给大家带来一些帮助,也能真正的提高自己。
能力一般,水平有限,如有错误,还希望各位朋友们能指出。
1、阿里巴巴2011实习生笔试题
给一篇文章,里面是由一个个单词组成,单词中间空格隔开,再给一个字符串指针数组,
比如 char *str[]={"hello","world","good"};
求文章中包含这个字符串指针数组的最小子串。注意,只要包含即可,没有顺序要求。
分析:文章也可以理解为一个大的字符串数组,单词之前只有空格,没有标点符号。我最开始想到的思路,是:维护一个队列+KMP算法让字符的全部序列入队,比较完一个就出队,保持长度至于字符串的六种序列,实现排列预处理,最后,时间复杂度为:O(字符事先排列)+O(KMP比较)。后来,本BLOG算法交流群内有人提出:
Sur鱼:这个用kmp算法的话,明显不如用trie好;将str中的成员建一棵trie树,这样的话字符事先不需要排序,复杂度应该低些。
梦想天窗:我觉得这个应该用DFA(即有限状态自动机)。
2、淘宝笔试题:
1). 设计相应的数据结构和算法,尽量高效的统计一片英文文章(总单词数目)里出现的所有英文单词,按照在文章中首次出现的顺序打印输出该单词和它的出现次数。
2)、有一棵树(树上结点为字符串或者整数),请写代码将树的结构和数据写到一个文件中,并能通过读取该文件恢复树结构 。
3、淘宝算法面试题:两个用户之间可能互相认识,也可能是单向的认识,用什么数据结构来表示?如果一个用户不认识别人,而且别人也不认识他,那么他就是无效节点,如何找出这些无效节点?自定义数据接口并实现之,要求尽可能节约内存和空间复杂度。
4、淘宝笔试题:对于一颗完全二叉树,要求给所有节点加上一个pNext指针,指向同一层的相邻节点;如果当前节点已经是该层的最后一个节点,则将pNext指针指向NULL;给出程序实现,并分析时间复杂度和空间复杂度。
5、阿里巴巴研究院(2009):
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)
6、Alibaba笔试题:给定一段产品的英文描述,包含M个英文字母,每个英文单词以空格分隔,无其他标点符号;再给定N个英文单词关键字,请说明思路并编程实现方法
String extractSummary(String description,String[] key words)
目标是找出此产品描述中包含N个关键字(每个关键词至少出现一次)的长度最短的子串,作为产品简介输出。(不限编程语言)20分。(扫描过程始终保持一个[left,right]的range,初始化确保[left,right]的range里包含所有关键字则停止。然后每次迭代:
1,试图右移动left,停止条件为再移动将导致无法包含所有关键字。
2,比较当前range's length和best length,更新最优值。
3,右移right,停止条件为使任意一个关键字的计数+1。
4,重复迭代。
编程之美有最短摘要生成的问题,与此问题类似,读者可作参考。)
7、一个淘宝的面试题。文件A:uid username 文件B:username password
文件A是按照uid有序排列的,要求有序输出合并后的A,B文件,格式为uid username password(A B两个文件都很大,内存装不下。)
8、 9月22日,阿里巴巴北邮站
点评:这里有一朋友关于上述3题的题解:http://blog.csdn.net/thebestdavid/article/details/11975809,大家可以
9、9月25日,阿里巴巴二面
指针/数组区别,决策树训练原理,SVM原理,网络协议,堆排序,字符串转换成整数,设计一款拼音输入法等等..
点评:字符串转换成整数看似简单,实则很多坑,要写好并不容易,具体分析和实现见编程艺术第30章:http://blog.csdn.net/v_july_v/article/details/9024123;决策树见:http://blog.csdn.net/v_july_v/article/details/7577684;SVM原理见:http://blog.csdn.net/v_july_v/article/details/7624837。
总结:此次面试的这位同学面的还是堆排/快排/atoi等典型问题,实际上:①面试看基础算法编程能力,和准备是否充分;②不论结果如何,跟4年前高考一样,高考和面试都只是人生路上的其中一站。你的真正核心竞争力不是进哪所名校哪所名企,而是存在你骨子里的上进心或热爱钻研技术的态度。
10、阿里巴巴面试:
阿里的log文件如下,有三个字段:time(登陆或登出时间点)+uid+login或logout,每条记录按时间顺序排列。问题如下:给定一个时间点T,统计在线人数。
点评:参考分析请见http://blog.csdn.net/tnndye/article/details/12784237。
1、 12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?
这个笔试题,很YD,因为把某个递归关系隐藏得很深。
2 、1)、澳大利亚的父母喜欢女孩,如果生出来的第一个女孩,就不再生了,如果是男孩就继续生,直到生到第一个女孩为止,问若干年后,男女的比例是多少?
2)、3点15的时针和分针的夹角是多少度
3)、有8瓶水,其中有一瓶有毒,最少尝试几次可以找出来
3、阿里云笔试题:一个HTTP服务器处理一次请求需要500毫秒,请问这个服务器如何每秒处理100个请求。
4、 10.10阿里云部分笔试题目:
1)、一个树被序列化为数组,如何反序列化。
2)、如何将100百万有序数据最快插入到STL的map里。
3)、有两个线程a、b分别往一条队列push和pop数据,在没有锁和信号量的情况下如何避免冲突访问。
4)、写一个函数,功能是从字符串s中查找出子串t,并将t从s中删除。
5 、阿里云笔试:有101根电线 每根的一头在楼底 另一端在楼顶 有一个灯泡 一个电池 无数根很短的电线 怎么样在楼上一次在楼下去一次将电线的对应关系弄清楚。
6、 1)今天10.10阿里云笔试@土豆:1、三次握手;
2)、死锁的条件。(互斥条件(Mutual exclusion):1、资源不能被共享,只能由一个进程使用。2、请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。3、非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。4、循环等待条件(Circular wait):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。处理死锁的策略:1.忽略该问题。例如鸵鸟算法,该算法可以应用在极少发生死锁的的情况下。为什么叫鸵鸟算法呢,因为传说中鸵鸟看到危险就把头埋在地底下,可能鸵鸟觉得看不到危险也就没危险了吧。跟掩耳盗铃有点像。2.检测死锁并且恢复。3.仔细地对资源进行动态分配,以避免死锁。4.通过破除死锁四个必要条件之一,来防止死锁产生。)
7、淘宝:在现代web服务系统的设计中,为了减轻源站的压力,通常采用分布式缓存技术,其原理如下图所示,前端的分配器将针对不同内容的用户请求分配给不同的缓存服务器向用户提供服务。
分配器
/ | \
缓存 缓存 . ..缓存
服务器1服务器2 ...服务器n
请问如何设置分配策略,可以保证充分利用每个缓存服务器的存储空间(每个内容只在一个缓存服务器有副本)
2)当部分缓存服务器故障,或是因为系统扩容,导致缓存服务器的数量动态减少或增加时,你的分配策略是否可以保证较小的缓存文件重分配的开销,如果不能,如何改进?
3)当各个缓存服务器的存储空间存在差异时(如有4个缓存服务器,存储空间比为4:9:15:7),如何改进你的策略,按照如上的比例将内容调度到缓存服务器?(思路:往memcached或者一致性hash算法方面考虑,但具体情况,具体分析。)
8、支付宝10.20笔试题:汉诺塔一共为 2*N,2个一样大小,有编号顺序每次只能移动一个大的不能叠在小得上面移动完之后,相同大小的编号必须和原来一样问最小要移动多少次?如 A1 A2 B1 B2 C1 C2 ...... 这样叠,A不能放A上面,C不能放B A上面,移动到另外一个柱子后,还必须是 A1 A2 B1 B2 C1 C2 ....
9、阿里笔试题:平面上有很多点,点与点之间有可能有连线,求这个图里环的数目。
10、阿里云,搜索引擎中5亿个url怎么高效存储?
11、阿里巴巴面试题。对于给定的整数集合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/index.html#!answerId=569。
12、阿里巴巴笔试题1,原题大致描述有一大批数据,百万级别的。数据项内容是:用户ID、科目ABC各自的成绩。其中用户ID为0~1000万之间,且是连续的,可以唯一标识一条记录。科目ABC成绩均在0~100之间。有两块磁盘,空间大小均为512M,内存空间64M。
1) 为实现快速查询某用户ID对应的各科成绩,问磁盘文件及内存该如何组织;
2) 改变题目条件,ID为0~10亿之间,且不连续。问磁盘文件及内存该如何组织;
3) 在问题2的基础上,增加一个需求。在查询各科成绩的同时,获取该用户的排名,问磁盘文件及内存该如何组织。
13、代码实现计算字符串的相似度。
点评:和计算两字符串的最长公共子序列相似。
设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/flyinghearts/article/details/5605996。
14、 10月9日,阿里巴巴2013校园招聘全套笔试题(注:下图中所标答案不代表标准答案,有问题,欢迎留言评论)
上述第15)题,填空:lower+ (upper-lower)/2
lower mid upper
0 6
12
7 9
12
7 7
8
8 8
8
比较4次
上述第16)题,解答如下图所示:
上述第17)题,解答如下图所示:
18)、甲包8个红球 2个蓝球,乙包2个红球 8个蓝球。抛硬币决定从哪个包取球,取了11次,7红4蓝。注,每次取后还放进去,只抛一次硬币。问选的是甲包的概率?
点评:
贝叶斯公式 + 全概率公式作答(参看链接:http://www.doc88.com/p-132711202556.html)。具体解答如下图所示:
注:上述第15~18的解答全部来自读者Lei Lei来信给出的解答,他的博客地址是:http://blog.csdn.net/nwpulei,特此感谢。有任何问题,欢迎随时讨论&指正,同时,更欢迎其他朋友也一起来做这些题目(你的答案一经选用,我可以根据你的要求,贴出你的个人主页或微博地址或博客地址)。
19)、已知一个n个元素的数组,第i个元素在排序后的位置在[i-k,i+k]区间,k<
读者twtsa毛遂自荐,这是他给出的上述第19)~20)题的个人题解:http://blog.csdn.net/twtsa/article/details/8055143。有任何问题,欢迎随时讨论&指正。
14 、10月11日,阿里巴巴笔试部分题目:
1). 甲乙两个人上街,捡到一张10块钱的购物卡,两人就想出一个办法来分配这张卡。两个分别将自己出的价格写在纸上,然后看谁出的价高就给谁,并且那个出价高的人要把出的钱给对方。现在甲有6块钱,乙有8块钱。问谁获得的钱多。(多选)
A 甲多 B乙多 C一样多 D有可能出现有人赔钱的情况
2). 有一个怪物流落到一个荒岛上,荒岛上有n条鳄鱼。每条鳄鱼都有实力单独吃掉怪物。但是吃掉怪物是有风险的,会造成体力值下降,然后会有可能被掉其他鳄鱼吃。问,最后那个怪物是危险的还是安全的?
3). 算法题:
A[i]是一个有序递增数组,其中所有的数字都不相等,请设计一种算法,求出其中所有的A[i]=i的数字并分析时间复杂度,不分析复杂度不得分。
4). 大题
你在浏览器中输入网址:http://blog.csdn.net/v_JULY_v,按下回车键后,会发生什么事情,请一一描述(20分)。包括浏览器,网络,服务器等等发生的事情,及各项关键技术。
点评:这样的题考过很多次,参考答案如下图所示:
15 、10月16日,UC的笔试题目:
1)、有个长度为2n的数组{a1,a2,a3,...,an,b1,b2,b3,...,bn},希望排序后{a1,b1,a2,b2,....,an,bn},要求时间复杂度o(n),空间复杂度0(1)。
点评:@绿色夹克衫:完美洗牌问题「关于洗牌算法:http://blog.csdn.net/gogdizzy/article/details/4917488」,解决这个问题的关键在于如何解决置换群中的环。方法是微软员工那篇论文中写的:http://user.qzone.qq.com/414353346/blog/1243343118#!app=2&via=QZ.HashRefresh&pos=1243343118,大概意思是,用3的幂来弄:
@方程:
a) int index = arr.length / 2;
b) int temp = arr[index];
c) while(index != 1){
d) int tempIndex = (index + (index % 2) * (arr.length - 1)) / 2;
e) arr[index] = arr[tempIndex];
f) index = tempIndex;
g) }
h) arr[1] = temp;
链接:1,http://www.51nod.com/question/index.html#!questionId=278;2、这里也有一参考答案:http://blog.csdn.net/yuan8080/article/details/5705567。
17 、9月14日,阿里巴巴2014校招笔试哈尔滨站
宿舍内5个同学一起玩对战游戏。每场比赛有一些人作为红方,另一些人作为蓝方。请问至少需要多少场比赛,才能使任意两个人之间有一场红方对蓝方和蓝方对红方的比赛?答案为4场,参考如下图,作者doc_sgl:
点评:其余题目请参见:http://blog.csdn.net/doc_sgl/article/details/11695671。
18 、9月14日,阿里巴巴-系统工程师-北京站
其它题目请参见:http://blog.csdn.net/lingfengtengfei/article/details/12344511。