存档在 ‘笔试面试题目’ 分类

【转载自好朋友】阿里5.5号测试开发笔试

2013年5月13日

提前到达教室,拿到卷子一看,傻眼了!尼玛,好吧,估计又是酱油了!阿里的题目确实比腾讯难多了,怪不得当时听阿里宣讲会的时候,一个“码神”说过30分就会给面试机会。阿里考概率的题目比较多,看来阿里很看重概率方面的知识。不过有一个选择题知道怎么做,结果在开3次方的时候开错了,尼玛!能不能不要这么悲剧啊。反正好多题目都不会啊,什么“数星星”、“明星群众”都不懂啊,最后一个算法题,更是一点思路都没有。前面的所有题目,研发、测试开发、算法工程师都是一样的。测试类的最后还有一个附加测试题目,随便写了一点。下面说一下那个“数星星”问题。

题意:A和B,晚上闲来无事,开始数星星(我看到题目的时候就在想,他俩一定是闲的蛋疼。没事,你打局游戏啊;没事,你看个电影啊;没事,你数什么星星啊),每次只能数k个,20<=k<=30,A先数,谁数完最后一组谁获胜,问星星总数为4个选项中哪一个的时候,A必胜。(我觉的这个题最后应该补充一句:最后一组可以小于20) 思路:A第一次数20-30之间,为了让自己胜利,他最后留给B的星星数为31-50(也就是当剩下31-50颗星星时,无论B怎么数,A一定取胜,)并且从第二次开始,A数的星星个数为50-B数的星星个数。当这两个条件同时满足时,A一定取胜。 至于为什么是50,现给出解释:如果是49,则当B数30个时,留给A的是19,不满足条件;当是51,则当B数20个时候,留给A的是31,不满足条件;只有当是50时,无论B怎么数,留给A的都符合条件。此题的关键就是找出这个50。当明白了以上几点的话,下面写出大体公式 星星总数:20~30+50*k+31~50(也就是总数除以50的余数得同时满足开始条件20~30和结束条件31~50) 以第一个选项2013为例,2013%50=13,这个时候得向高位借50,即2013/50=39,2013%50=63.接下来验证63是否满足开始条件和结束条件。63-(20~30)都落在31~50之间,满足条件。(貌似这个题只有选项2013满足) 下面举个反例2888,2888%50=38(38向不向高位借50都不满足,如果借50则余数为88),验证38或88不同时满足初始条件和结束条件。

【转载自好朋友】2013腾讯实习生(测试)笔试、一面、二面过程

2013年5月13日

题记:这是记录我笔试、面试过程的第一篇文章。腾讯是我第一次真正意义上的笔试、面试公司。之前,投了网易游戏游戏的QA,但是电面被刷了(第一次电面)。其实,文章标题中的“过程”我很想写成“面经”的,但是实在是谈不上经验啊。好了,言归正传。

笔试:4.20西十二笔试,之前在网上看很多面经说,腾讯考的范围广但是题目不难。事后证明确实是这样,因为3月开学后把网络、操作系统等又看了一遍,所以,笔试做的还可以。题目记不清了(恨自己当时没写下来啊),几乎全是选择跟填空。网络、操作系统、数据库、数据结构算法等,范围确实很广。22号网上10点50多收到一面通知,4.24下午4点。其实,当时以为自己挂了,很多童鞋早就收到面试通知了。

一面:提前一个多小时到达珞珈山大酒店(做任何事情,我一般都会提前好多到,早了总比晚了好),签到,等待,面试。面试官是个GG,眼睛很深邃。我进房间后对话大体如下。

他:名字不错啊。。。

我:(笑笑)。。。。

他:(找到我的笔试试卷)

我:我能看一下我得了多少分吗?

他:(我没听清他说的什么,反正没让我看)

我:(他找到我试卷的时候我说)我网络部分做的不是很好(本来以为他不会深入问了呢,结果,尼玛,

这才是悲剧的开始)

他:TCP三次握手?

我:blabla….

他:为什么需要第三次?也就是说我觉得第三次没必要,第三次我觉得就是多余的!

我:blablalba。。。(我也忘了当时怎么说的了,反正没说出个所以然,当他用这个问题折磨我了好久之

后,终于说:ok,下一个问题)

他:DNS原理

我:D..N..S..原理,额。。不好意思,我不是很懂。。。。

他:一个端口能不能绑定多个端口号。。。

我:blalba。。。。

之后,他又问了我好多网络的问题,感觉面试一半以上的时间都在问我网络,而且还很深入,我就是一个菜

鸟,只懂一点皮毛,这。。。这让我情何以堪啊。在用网络折磨了我一段时间后,终于换其他方面来折磨我

了。

他:(看着我的简历,实际上他是按我简历上写的来问的)线程、进程。。

我:blalba。。我提到了windows的进程、线程还有回调函数等。(回答的还可以,后面有证据)

他:UI线程懂不?

我:不好意思,这个不是很懂。

他:内存管理方式。

我:(我回答时看着旁边,没有看着他,因为他一直在笔记本上敲着什么东西)段式、页式、段页式。。。。

他:你是在背吗?怎么感觉想在背啊?

我:(听到这句话时,让我想到了某求职节目某SB主持人说的:“你是在表演吗!”无语啊!太伤自尊了

即使我背出来,那也是我的本事啊) 没有,我。。我前几天刚看过

(提醒各位童鞋一下,面试时一定要看着面试官,哪怕他不看着你)

他又问了我几个windows方面的问题后,来了一句:你有从事过windows的相关开发吧?

我:(终于说了一句让我比较欣慰的话,心里暗喜)奥,没有,只是看过一些视频教程。

之后话题转到linux,问道的命令包括ls -a、df、top、free(好吧,这个当时没想起来)。之后,数据结构算法。

他:用递归写一个二分查找。

(尼玛,非递归我写出来就不错了)我先把非递归写了出来(结果还出现了错误),然后,他直接看我的非递

归没让写递归。

他:const与#define区别。

我:blabla。。。回答的不好。

最后他拿出一个题目本(一个小本本,上面全是题目),让我做了一个运算符优先级的问题,然后,我没让他失望,做错了。。。

以上大概就是一面的过程,感觉他问我好多网络题,可能不同的面试官问的问题不一样吧。当时感觉必挂无疑了,结果24号晚上同一时间收到二面通知。

二面:4.25上午11:00,还是提前到。等到我的时候,已经11点过几分钟了,前面那个大神是从中南过来的,面了一个多小时,直接通知去三面了。这个面试官还是一个GG,只不过身材比较壮硕。也是一直对着一台笔记本噼里啪啦敲个不停。问了我一些测试方面的问题,“一个人用微信给另一个人发送一张图片结果失败了,怎么测试?”我bla了半天,回答的不好。之后又问了一个什么问题我忘了,反正我扯到了游戏测试上,扯到了CF,结果,最后悲剧了。最后,他说:可能让你失望了,我们是做qq空间的测试,不是游戏测试。我x,不是游戏测试啊?!我投的是什么IGE互动娱乐方向的,反正就是游戏方向的,结果告诉我不是游戏测试,而我回答的都是游戏测试的。他又让我问他一个问题。我哪还有什么心情问啊,随便问了一下。然后告诉我回去等通知。出来看了一下手机,才面了半个小时,二面每个人的面试时间是按一个小时来的,我安排的11点,是最后一个。看来,注定悲剧啊!我不挂,谁挂!

然后就回学校了,知道自己悲剧了,也就没再期待。后来隔了一天微信查到进了“人才库”(好吧,我们都称它为“垃圾通”)。

以上就是我腾讯的笔试、面试过程,虽然挂了,但是学到了很多东西。虽挂犹荣啊,呵呵!现在打酱油,秋招的时候才能不打酱油

淘宝广告搜索平台部面试

2013年5月13日

1、 在白板上写个tcp服务端程序的大致框架。
2、 问:除了你写的多线程和多进程的方法,还有什么方式实现服务端的高并发,提高性能?
3、 阻塞和非阻塞方式的特点和区别?阻塞方式有什么优势?
4、 同步和互斥,读写锁。。。?(不熟悉)我常用的是互斥,如果并发读如何?
5、 TCP三次握手的漏洞,攻击方式?
6、 TCP/UDP区别? TCP怎么做可靠传输?
7、 什么是Trie树?怎么做?
8、 搜索引擎的索引结构,url怎么做索引?(不知道,没研究过)面试官笑。。。
9、 1000个同学成绩表中,找到和为160的两个学生的所有解
10、 5亿个query中找出top1000

腾讯SOSO面试总结

2013年5月13日

题目:
1、给定一个数组a[N]数组大小为N,数组中有M个元素,编程实现插入一个整数b的函数,如果数组空间不够则将最小的数淘汰掉
2、求字符串之间的最大匹配,最长公共连续字串
3、数组的最大子段和

2013年阿里巴巴暑期实习招聘笔试题目及部分答案——5月5日

2013年5月12日

选择题答案是我给出的答案,正确性仅供参考喔!

一、单项选择题
1.下列说法不正确的是:
A.SATA硬盘的速度速度大约为500Mbps/s
B.读取18XDVD光盘数据的速度为1Gbps
C.前兆以太网的数据读取速度为1Gpbs
D.读取DDR3内存数据的速度为100Gbps

答案:D,大约速度为1.6Gbps
2.()不能用于Linux中的进程通信
A.共享内存
B.命名管道
C.信号量
D.临界区

答案:D
3.设在内存中有P1,P2,P3三道程序,并按照P1,P2,P3的优先级次序运行,其中内部计算和IO操作时间由下表给出(CPU计算和IO资源都只能同时由一个程序占用):
P1:计算60ms—》IO 80ms—》计算20ms
P2:计算120ms—》IO 40ms—》计算40ms
P3:计算40ms—》IO 80ms—》计算40ms
完成三道程序比单道运行节省的时间是()
A.80ms
B.120ms
C.160ms
D.200ms

答案:C
4.两个等价线程并发的执行下列程序,a为全局变量,初始为0,假设printf、++、–操作都是原子性的,则输出不肯哪个是()

void foo() {
    if(a <= 0) {
        a++;
    }
    else {
        a--;
    }
    printf("%d", a);
}

A.01
B.10
C.12
D.22

答案:A
5.给定fun函数如下,那么fun(10)的输出结果是()

int fun(int x) {
    return (x==1) ? 1 : (x + fun(x-1));
}

A.0
B.10
C.55
D.3628800

答案:C
6.在c++程序中,如果一个整型变量频繁使用,最好将他定义为()
A.auto
B.extern
C.static
D.register

答案:D
7.长为n的字符串中匹配长度为m的子串的复杂度为()
A.O(N)
B.O(M+N)
C.O(N+LOGM)
D.O(M+LOGN)

答案:B
8.判断一包含n个整数a[]中是否存在i、j、k满足a[i] + a[j] = a[k]的时间复杂度为()
A.O(n) B.O(n^2) C.O(nlog(n)) D.O(n^2log(n))

答案:C
9.三次射击能中一次的概率是0.95,请问一次射击能中的概率是多少?
A.0.63
B.0.5
C.**
D.0.85

答案:A
10.下列序排算法中最坏复杂度不是n(n-1)/2的是_
A.快速序排 B.冒泡序排 C.直接插入序排 D.堆序排

答案:D
二、不定向选择题
1.以下哪些进程状态转换是正确的()
A.就绪到运行 B.运行到就绪 C.运行到阻塞 D.阻塞到运行

答案:ABC
2.一个栈的入栈数列为:1、2、3、4、5、6;下列哪个是可能的出栈顺序。

A 123465  B 154623  C 312546  D 325641

答案:AD
3.下列哪些代码可以使得a和b交换数值。

A b=a+b; a=a+b; b=b-a; B a=a|b; b=b+a; a=b-a; C a=a-b; b=a+b; a=b-a; D a=a+b;b=a-b;a=b|a;

答案:C
4.A和B晚上无聊就开始数星星。每次只能数K个(20<=k<=30)A和B轮流数。最后谁把星星数完谁就获胜,那么当星星数量为多少时候A必胜?

答案:A
三、填空问答题
1.给你一个整型数组A[N],完成一个小程序代码(20行之内),使得A[N]逆向,即原数组为1,2,3,4,逆向之后为4,3,2,1
void revense(int * a,int n) {

}
2.自选调度方面的问题,题目很长,就是给你三个线程,分别采用先来先分配的策略和最短执行之间的调度策略,然后计算每个线程从提交到执行完成的时间。题目实在太长,还有几个表格。考察的是操作系统里面作业调度算法先进先出和最短作业优先。
3.有个苦逼的上班族,他每天忘记定闹钟的概率为0.2,上班堵车的概率为0.5,如果他既没定闹钟上班又堵车那他迟到的概率为1.0,如果他定了闹钟但是上班堵车那他迟到的概率为0.9,如果他没定闹钟但是上班不堵车他迟到的概率为0.8,如果他既定了闹钟上班又不堵车那他迟到的概率为0.0,那么求出他在60天里上班迟到的期望。
4.战报交流:战场上不同的位置有N个战士(n>4),每个战士知道当前的一些战况,现在需要这n个战士通过通话交流,互相传达自己知道的战况信息,每次通话,可以让通话的双方知道对方的所有情报,设计算法,使用最少的通话次数,是的战场上的n个士兵知道所有的战况信息,不需要写程序代码,得出最少的通话次数。
5.有N个人,其中一个明星和n-1个群众,群众都认识明星,明星不认识任何群众,群众和群众之间的认识关系不知道,现在如果你是机器人R2T2,你每次问一个人是否认识另外一个人的代价为O(1),试设计一种算法找出明星,并给出时间复杂度(没有复杂度不得分)。
解答:这个问题等价于找未知序列数中的最小数,我们将reg这个函数等价为以下过程:,如果i认识j,记作i大于等于j,同样j不一定大于等于i,满足要求,i不认识j记作i<j,对明星k,他不认识所有人,则k是其中最小的数,且满足其余的人都认识他,也就是其余的人都大于等于k.这样问题就被转换了。就拿N=5来说,首先有数组S[5]={A,B,C,D,E}这5个变量,里边存放着随机数,求是否存在唯一最小数,如果存在位置在S中的哪里。(楼主这里是这个意思,按我的理解题中这个最小数一定是存在且唯一的)

int finds(S,N)
{
    int flag=0;//用于判定是否有明星,即当前最小数另外出现几次
    int temp=0;//存放最小数在S中的位置
    for(i=1;i<N;i++)
   {
      if(!reg(S[i],S[temp])//如果temp标号的数小于i标号的数
     {
         temp=i;
         flag=0;//更换怀疑对象(最小数)时,标记清零
      }
      elseif(reg(S[temp],S[i])//如果temp里存放的确实是唯一最小数是不会跑进这里来的
      {
           flag++;
`     }
    }
    if(flag>0) return -1;//表示没有明星,例如所有的数都相等
    return temp;//返回明星在S中的位置
}

四、综合题
有一个淘宝商户,在某城市有n个仓库,每个仓库的储货量不同,现在要通过货物运输,将每次仓库的储货量变成一致的,n个仓库之间的运输线路围城一个圈,即1->2->3->4->…->n->1->…,货物只能通过连接的仓库运输,设计最小的运送成本(运货量*路程)达到淘宝商户的要求,并写出代码。
解答:这个题目类似的题目有:
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1045
有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传
递一个糖果代价为1,求使所有人获得均等糖果的最小代价。
分析:
假设a1分给an的糖果数为k,则可以得到以下的信息:
a1 a2  a3         an-1              an
当前数目:a1-k a2         a3         an-1              an+k
所需代价:|a1-k-ave| |a1+a2-k-2*ave| |a1+a2+a3-k-3*ave||a1+..+a(n-1)-k-(n-1)*ave| |k|
以sum[i]表示从a1加到ai减掉i*ave的和值,这以上可以化简为
总代价 = |s1-k|+|s2-k|+…+|s(n-1)-k|+|k|
不难看出:当k为s1…s(n-1)中的中位数的时候,所需的代价最小
代码转载于网络:

#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;
const int X = 1000005;
typedef long long ll;
ll sum[X],a[X];
ll n;
ll Abs(ll x){
    return max(x,-x);
}
int main(){
    //freopen("sum.in","r",stdin);
    while(cin>>n){
        ll x;
        ll tot = 0;
        for(int i=1;i<=n;i++){
            scanf("%lld",&a[i]);
            tot += a[i];
        }
        ll ave = tot/n;
        for(int i=1;i<n;i++)
            sum[i] = a[i]+sum[i-1]-ave;
        sort(sum+1,sum+n);
        ll mid = sum[n/2];
        ll ans = Abs(mid);
        for(int i=1;i<n;i++)
            ans += Abs(sum[i]-mid);
        cout<<ans<<endl;
    }
    return 0;
}

百度2013年校园招聘笔试题目

2013年1月20日

一:简答题(30)
1:数据库以及线程发生死锁的原理及必要条件,如何避免死锁
答:
产生死锁的原因主要是:
(1) 因为系统资源不足。
(2) 进程运行推进的顺序不合适。
(3) 资源分配不当等。
产生死锁的四个必要条件:
(1)互斥条件:一个资源每次只能被一个进程使用。
(2)请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3)不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4)循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
避免死锁:
死锁的预防是通过破坏产生条件来阻止死锁的产生,但这种方法破坏了系统的并行性和并发性。
死锁产生的前三个条件是死锁产生的必要条件,也就是说要产生死锁必须具备的条件,而不是存在这3个条件就一定产生死锁,那么只要在逻辑上回避了第四个条件就可以避免死锁。
避免死锁采用的是允许前三个条件存在,但通过合理的资源分配算法来确保永远不会形成环形等待的封闭进程链,从而避免死锁。该方法支持多个进程的并行执行,为了避免死锁,系统动态的确定是否分配一个资源给请求的进程。
预防死锁:具体的做法是破坏产生死锁的四个必要条件之一
2:面向对象的三个基本元素,五个基本原则
答:
三个基本元素:
封装
继承
多态
五个基本原则:
单一职责原则(Single-Resposibility Principle):一个类,最好只做一件事,只有一个引起它的变化。单一职责原则可以看做是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。
开放封闭原则(Open-Closed principle):软件实体应该是可扩展的,而不可修改的。也就是,对扩展开放,对修改封闭的。
Liskov替换原则(Liskov-Substituion Principle):子类必须能够替换其基类。这一思想体现为对继承机制的约束规范,只有子类能够替换基类时,才能保证系统在运行期内识别子类,这是保证继承复用的基础。
依赖倒置原则(Dependecy-Inversion Principle):依赖于抽象。具体而言就是高层模块不依赖于底层模块,二者都同依赖于抽象;抽象不依赖于具体,具体依赖于抽象。
接口隔离原则(Interface-Segregation Principle):使用多个小的专门的接口,而不要使用一个大的总接口。
3:windows内存管理的机制以及优缺点
答:
分页存储管理基本思想:
用户程序的地址空间被划分成若干固定大小的区域,称为“页”,相应地,内存空间分成若干个物理块,页和块的大小相等。可将用户程序的任一页放在内存的任一块中,实现了离散分配。
分段存储管理基本思想:
将用户程序地址空间分成若干个大小不等的段,每段可以定义一组相对完整的逻辑信息。存储分配时,以段为单位,段与段在内存中可以不相邻接,也实现了离散分配。
段页式存储管理基本思想:
分页系统能有效地提高内存的利用率,而分段系统能反映程序的逻辑结构,便于段的共享与保护,将分页与分段两种存储方式结合起来,就形成了段页式存储管理方式。
在段页式存储管理系统中,作业的地址空间首先被分成若干个逻辑分段,每段都有自己的段号,然后再将每段分成若干个大小相等的页。对于主存空间也分成大小相等的页,主存的分配以页为单位。
段页式系统中,作业的地址结构包含三部分的内容:段号 页号 页内位移量
程序员按照分段系统的地址结构将地址分为段号与段内位移量,地址变换机构将段内位移量分解为页号和页内位移量。
为实现段页式存储管理,系统应为每个进程设置一个段表,包括每段的段号,该段的页表始址和页表长度。每个段有自己的页表,记录段中的每一页的页号和存放在主存中的物理块号。

二:程序设计题(40)

1:公司里面有1001个员工,现在要在公司里面找到最好的羽毛球选手,也就是第一名,每个人都必须参赛,问至少要比赛多少次才能够找到最好的羽毛球员工。
答:两两比赛,分成500组剩下一人,类似于归并排序的方式,比出冠军后,让冠军之间再比,主要是要想想多余的那一个选手如何处理,必然要在第一次决出冠军后加入比赛组。

2:现在有100个灯泡,每个灯泡都是关着的,第一趟把所有的灯泡灯泡打开,第二趟把偶数位的灯泡制反(也就是开了的关掉,关了的打开),第三趟让第3,6,9….的灯泡制反…….第100趟让第100个灯泡制反,问经过一百趟以后有多少灯泡亮着
答:
1.对于每盏灯,拉动的次数是奇数时,灯就是亮着的,拉动的次数是偶数时,灯就是关着的。
2.每盏灯拉动的次数与它的编号所含约数的个数有关,它的编号有几个约数,这盏灯就被拉动几次。
3.1——100这100个数中有哪几个数,约数的个数是奇数。我们知道一个数的约数都是成对出现的,只有完全平方数约数的个数才是奇数个。
所以这100盏灯中有10盏灯是亮着的。
它们的编号分别是: 1、4、9、16、25、36、49、64、81、100。
3:有20个数组,每个数组有500个元素,并且是有序排列好的,现在在这20*500个数中找出排名前500的数
答:TOP-K问题,用个数为K的最小堆来解决
4. 字符串左移,void *pszStringRotate(char *pszString, intnCharsRotate),比如ABCDEFG,移3位变DEFGABC,要求空间复杂度O(1),时间复杂度O(n)

三:系统设计题(30)

现在有一个手机,手机上的键盘上有这样的对应关系,2对应”abc”,3对应”def”…..手机里面有一个userlist用户列表,当我们输入942的时候出来拼音的对应可能是“xia”,“zha”,“xi”,“yi”等,当我们输入9264的时候出来是yang,可能是“样”,“杨”,“往”等,现在我们输入一个字符串数字,比如926等,要在电话簿userlist中查找出对应的用户名和电话号码并返回结果。
C++语言: 电话号码对应的英语单词(注意此题的非递归做法)

#include <iostream>  
#include <cstdlib>  
#define N 4 //电话号码个数  
 
using namespace std; 
 
char c[][10] = {"","","ABC","DEF","GHI","JKL","MNO","PQRS","TUV","WXYZ"};//存储各个数字所能代表的字符  
int number[N] = {2, 4 ,7, 9}; //存储电话号码  
int total[10] = {0, 0, 3, 3, 3, 3, 3, 4, 3, 4}; //各个数组所能代表的字符总数  
int answer[N]; //数字目前所代表的字符在其所能代表的字符集中的位置,初始为0  
 
void Search(int *number, int n); //非递归的办法  
void RecursiveSearch(int *number, int cur, char *ps, int n); //递归的办法 
int main() 
{ 
        //Search(number, N);  
        char ps[N+1] = {0}; 
        RecursiveSearch(number, 0, ps, N); 
        return 0; 
} 
 
 
void Search(int *number, int n) 
{ 
        int i; 
        while(1) 
        { 
                for(i=0; i<n; ++i) 
                        printf("%c", c[number[i]][answer[i]]); 
                printf("\n"); 
                int k = n-1;    //用k和while循环来解决扩展性问题,模拟了递归  
                while(k >= 0) 
                { 
                        if(answer[k] < total[number[k]]-1) 
                        { 
                                ++answer[k]; 
                                break; 
                        } 
                        else 
                        { 
                                answer[k] = 0; 
                                --k; 
                        } 
                } 
                if(k < 0) 
                        break; 
        } 
} 
 

/*递归的解法: number为存储电话号码的数组,pos为当前处理的数字在number中的下标,初始为0
*ps为一外部数组,用于存放字母,n代表电话号码的长度(个数)
* 此递归的方法好理解,比上面非递归的办法好写易懂
* */

void RecursiveSearch(int *number, int pos, char *ps, int n) 
{ 
        int i; 
        for(i=0; i<total[number[pos]]; ++i) 
        { 
                ps[pos] = c[number[pos]][i]; 
                if(pos == n-1) 
                        cout<<ps<<endl; 
                else 
                        RecursiveSearch(number, pos+1, ps, n); 
        } 
} 

阿里巴巴2010年校园招聘笔试题目

2013年1月20日

[print_gllr id=2329]

阿里巴巴2013年实习生招聘笔试题目

2013年1月20日

[print_gllr id=2316]