阿里巴巴2014秋季校园招聘-软件研发工程师笔试题详解(转)
第一部分: 单选题
1. 假设把整数关键码K散列到N个槽列表,以下哪些散列函数是好的散列函数
A: h(K)=K/N;
B: h(K)=1;
C: h(K)=K mod N;
D: h(K)=(K+rand(N)) mod N, rand(N)返回0到N-1的整数
解析:
首先,D最复杂,当然首选D。。
D选项使用的是随机数法+除留余数法。
- 开放地扯法: 公式 Hi=(H(key)+di) MOD m i=1,2,...,k(k<=m-1) 其中,m为哈希表的表长。di 是产生冲突的时候的增量序列
- 再哈希法:设计二种甚至多种哈希函数,可以避免冲突,但是冲突几率还是有的。
- 链地址法:拉出一个动态链表代替静态顺序存储结构,可以避免哈希函数的冲突,不过缺点就是链表的设计过于麻烦,增加了编程复杂度。此法可以完全避免哈希函数的冲
- 建立一个公共溢出区
答案:D
2. 下面排序算法中,初始数据集的排列顺序对算法的性能无影响的是:
A: 堆排序 B:插入排序
C: 冒泡排序 D:快速排序
解析:
- 插入排序:最优时间复杂度O(n)最差时间复杂度O(n^2)平均时间复杂度O(n^2)
- 冒泡排序:最优时间复杂度O(n)最差时间复杂度O(n^2)平均时间复杂度O(n^2)
- 快速排序:最优时间复杂度O(nlogn)最差时间复杂度O(n^2)平均时间复杂度O(nlogn)
- 堆排序:最优时间复杂度O(nlogn)最差时间复杂度O(nlogn)平均时间复杂度O(nlogn))
答案:A
3. 下面说法错误的是:
A: CISC计算机比RISC计算机指令多
B: 在指令格式中,采用扩展操作码设计方案的目的是为了保持指令字长不变而增加寻址空间
C:增加流水线段数理论上可以提高CPU频率
D:冯诺依曼体系结构的主要特征是存储程序的工作方式
解析:
A:RISC设计原则:指令条数尽可能少,一般为几十条指令;寻址方式尽可能少;采用等长指令,不管功能复杂的还是简单的指令,均用同一长度;设计尽可能多的通用寄存器
B:在指令格式中,采用扩展操作码设计方案的目的是为了保持指令字长不变而增加指令操作的数量
C:流水线设计可最大限度地利用了CPU资源,使每个部件在每个时钟周期都在工作,从而提高了CPU的运算频率。CPU采用级数更多的流水线设计可使它在同一时间段内处理更多的指令,有效提高其运行频率。
答案:B
4. 不属于冯诺依曼体系结构必要组成部分是:
A:CPU B: Cache C:RAM D:ROM
解析:
冯诺依曼体系结构:
答案:B
5. 一个栈的入栈序列式ABCDE则不可能的出栈序列是:
A:DECBA B:DCEBA C:ECDBA D:ABCDE
解析:腾讯2014笔试题也有这一题,画一下。。
答案:C
6.你认为可以完成编写一个C语言编译器的语言是:
A:汇编 B:C语言 C:VB D:以上全可以
解析:汇编肯定的可以的;任何语言都是可以自解释的,也就是可以用自己编写编译器解释自己,所以B也是对的;C应该也可以,不过答案已经出来了。
答案:D
7. 关于C++/JAVA类中的static成员和对象成员的说法正确的是:
A:static成员变量在对象构造时候生成
B: static成员函数在对象成员函数中无法调用
C: 虚成员函数不可能是static成员函数
D: static成员函数不能访问static成员变量
解析:
A:static成员变量在类的定义时初始化,不可以在对象的构造函数中初始化
B:static成员函数在对象成员函数中可以调用,同属于一个类作用域
C:static成员函数不可以声明为const和virtual
D:static成员函数只能访问static成员变量
答案:C
8:
解析:不会。。女朋友教我的
从A到Z的最短路径一定会有两条竖线
只看竖线组合路线不能往回走看上面的四条竖线第一条,下面4条竖线都可以选择,有4种走法第二条,有4种第三条,有3种第四条,有2种
答案:C
9:某进程在运行过程中需要等待从磁盘上读入数据,此时进程的状态将:
A: 从就绪变为运行 B:从运行变为就绪
C: 从运行变为阻塞 D:从阻塞变为就绪
- 运行状态(Running):进程占用处理器资源;处于此状态的进程的数目小于等于处理器的数目。在没有其他进程可以执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程。
- 就绪状态(Ready):进程已获得除处理器外的所需资源,等待分配处理器资源;只要分配了处理器进程就可执行。就绪进程可以按多个优先级来划分队列。例如,当一个进程由于时间片用完而进入就绪状态时,排人低优先级队列;当进程由I/O操作完成而进入就绪状态时,排入高优先级队列。
- 阻塞状态(Blocked):当进程由于等待I/O操作或进程同步等条件而暂停运行时,它处于阻塞状态。
10:下面算法的时间复杂度为:
Int f(unsigned int n)
{
If(n==0||n==1)
Return 1;
Else
Return n*f(n-1);
}
A: O(1) B:O(n) C:O(N*N) D:O(n!)
解析:做了n次乘法,时间复杂度为O(n)
答案:B
11: n从1开始,每个操作可以选择对n加1或者对n加倍。若想获得整数2013,最少需要多少个操作。
A:18 B:24 C:21 D;不可能
解析:逆推法,遇到偶数用除法
2013->2012->1006->503->502->251->250->125->124->62->31->30->15->14->7->6->3->2->1
正向只能是+1和×2,所以逆向只能-1和/2,由上过程可得18次
答案:A
12:对于一个具有n个顶点的无向图,若采用邻接表数据结构表示,则存放表头节点的数组大小为:
A: n B: n+1 C: n-1 D:n+边数
解析:图的邻接表表示
答案:A
13:
解析:不会,搬砖了。。对于几何中的每个字符串取hash可以看作是同分布的独立重复事件,所以每一个事件出现10的概率都是p=1/1024,那么当出现的时候,期望的次数就是1/p,1024.
答案:A.
14:如下函数,在32bit系统foo(2^31-3)的值是:
Int foo(int x)
{
Return x&-x;
}
A: 0 B: 1 C:2 D:4
解析:我很2地把2^31理解为2的31次方。。不好意思解释了,大家直接参考这边吧:
对于x & -x的含义:返回值为0,表示x=0;返回值为1,表示x为奇数;返回值为其他数,表示x为x与2^64的最大公约数,即二进制中从右到左的第一个1出现的位数
扩展:x & (x-1) 表示x进进制中1的个数,每执行一次x = x&(x-1),会将x用二进制表示时最右边的一个1变为0,因为x-1将会将该位(x用二进制表示时最右边的一个1)变为0
答案:C
15:对于顺序存储的线性数组,访问节点和增加节点删除节点的时间复杂度为:
A: O(n),O(n) B:O(n),O(1) C:O(1),O(n) D:O(n),O(n)
解析:基础
答案:C
16:在32为系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是:
Struct A
{
Int a;
short b;
int c;
char d;
};
Struct B
{
int a;
short b;
char c;
int d;
};
A: 16,16 B:13,12 C:16,12 D:11,16
解析:内存对齐,B中b和c占用一个4字节,A中b和c各占一个4字节。
答案:C
17:袋中有红球,黄球,白球各一个,每次任意取一个放回,如此连续3次,则下列事件中概率是8/9的是:
A: 颜色不全相同 B:颜色全不相同 C:颜色全相同 D:颜色无红色
解析:
颜色不全相同:1 - ( 1/3 * 1/3 * 1/3 ) * 3 = 8/9
颜色全不相同:1/3 * ( 1 - 1/3 ) * ( 1 - 1/3 - 1/3 ) = 2/9
颜色全相同: ( 1/3 * 1/3 * 1/3 ) * 3 = 1 /9
颜色无红色: ( 1 - 1/3 ) * ( 1 - 1/3 ) * ( 1 - 1/3 ) = 8/27
答案:A
18:一个洗牌程序的功能是将n张牌的顺序打乱,以下关于洗牌程序的功能定义说法最恰当的是:
A: 每张牌出现在n个位置上的概率相等
B: 每张牌出现在n个位置上的概率独立
C: 任何连续位置上的两张牌的内容独立
D: n张牌的任何两个不同排列出现的概率相等
答案:A
19:用两种颜色去染排成一个圈的6个棋子,如果通过旋转得到则只算一种,一共有多少种染色:
A: 10 B:11 C:14: D:15
解析:应该有14种方案,设只有黑白两色,默认白色,那么,用p(n)表示有n个黑棋的种类
p(0)=p(6)=1
p(1)=p(5)=1
p(2)=p(4)=3 //相邻的一种,隔一个的一种,两个的一种
p(3)=4 //都相邻的一种,BB0B的一种,BB00B的一种,B0B0B的一种,一共4种
综上是14种
答案:C
20:递归式的先序遍历一个n节点,深度为d的二叉树,则需要栈空间的大小为:
A: O(n) B:O(d) C:O(logn) D:(nlogn)
解析:根节点访问到叶子节点后就回溯了。所以所需要栈的最大空间为树的深度。
答案:B
第二部分:多选
21:两个线程运行在双核机器上,每个线程主线程如下,线程1:x=1;r1=y;线程2:y=1;r2=x;
X和y是全局变量,初始为0。以下哪一个是r1和r2的可能值:
A: r1=1,r2=1
B: r1=1,r2=0
C:r1=0,r2=0
D:r1=0,r2=1
解析:语句执行顺序组合,但是线程内的子句顺序不可变。
答案:ABD
22.关于Linux系统的负载,以下表述正确的是:
A: 通过就绪和运行的进程数来反映
B: 通过TOP命令查看
C: 通过uptime查看
D: Load:2.5,1.3,1.1表示系统的负载压力在逐渐变小
答案:BC(对于A不确定)
23:关于排序算法的以下说法,错误的是:
A: 快速排序的平均时间复杂度O(nlogn),最坏O(N^2)
B:堆排序平均时间复杂度O(nlogn),最坏O(nlogn)
C:冒泡排序平均时间复杂度O(n^2),最坏O(n^2)
D:归并排序的平均时间复杂度O(nlogn),最坏O(n^2)
答案:D
解释:归并排序的平均时间复杂度O(nlogn),最坏O(nlogn)
24:假设函数rand_k会随机返回一个【1,k】之间的随机数(k>=2),并且每个整数出现的概率相等。目前有rand_7,通过调用rand_7()和四则运算符,并适当增加逻辑判断和循环控制逻辑,下列函数可以实现的有:
A:rand_3 B:rand_21 C:rand_23 D:rand_49
答案:ABCD
解释:对于rand_x(x<7)的直接截断,只要rand数大于x直接忽略,保证rand_x能够做到概率相等。而对于其他的则采用7×rand_7+rand_7,可以-7得到rand_49,然后截断成rand_42,统一除以2,则是rand_21,其他类似。
第三部分 填空与问答
25、某二叉树的前序遍历序列为-+a*b-cd/ef,后序遍历序列为abcd-*+ef/-,问其中序遍历序列是___。
答案:a+b*c-d-e/f
26、某缓存系统采用LRU淘汰算法,假定缓存容量为4,并且初始为空,那么在顺序访问以下数据项的时候1,5,1,3,2,4,1,2出现缓存命中的次数是___。最后缓存中即将准备淘汰的数据项是___。
答案:3,3
解释:(LRU是Least Recently Used 近期最少使用算法。)1-》1,5-》5,1-》5,1,3-》5,1,3,2-》1,3,2,4-》3,2,4,1-》3,4,1,2-》
首先1调入内存,然后5调入内存,然后1调入内存(命中缓存),然后3调入内存,然后2调入内存,然后4调入内存(将最少使用的5置换出内存),然后1调入内存(命中缓存),然后2调入内存(命中缓存)。最后,最少使用的3将面临被置换出的危险。
27、两个较长的单向链表a和b,为了找出节点node满足node in a并且node in b。请设计空间使用尽量小的算法(用c/c++,java 或者伪代码)
答案:除了遍历,没有想到更好的办法。。网上搜的一种做法,感觉不对啊。。有答案的欢迎指点。
28、当存储数据量超出单节点数据管理能力的时候,可以采用的办法有数据库sharding的解决方案,也就是按照一定的规律把数据分散存储在多个数据管理节点N中(节点编号为0,1,2,,,,N-1)。假设存储的数据时a 请完成为数据a计算存储节点的程序。
答案:进行一次哈希,获取节点编号即可。原题中有给出代码,很简单,这里不再给出。
29、宿舍内5个同学一起玩对战游戏。每场比赛有一些人作为红方,另一些人作为蓝方。请问至少需要多少场比赛,才能使任意两个人之间有一场红方对蓝方和蓝方对红方的比赛?
解析:
一次划分中,某方可以有1人,另一方有4人或某方有2人,另一人有3人。
要使任意两个人之间有一场红方对蓝方和蓝方对红方的比赛,假设5个同学为A,B,C,D,E,相当有有向图的5个节点,任意两个节点间有两个方向的边连接。
即总的节点关系有(5个节点中选取两个节点)A(5,2)=5*4=20个关系。
而一次比赛(一次划分)能够生成的关系(一方两人一方三人的划分)c(2,1)*c(3,1)=2*3=6或者(一方四人一方一人的划分)c(4,1)*(c(1,1)=4*1=4,
所以一场比赛(一次划分)最多生成的关系次数为6
所以需要20/6=3.33..即至少需要4场比赛
答案:4场,分别是AB-CDE、ACD-BE、BCE-AD、DE-ABC
参考:
http://blog.csdn.net/zhanglei0107/article/details/11856777 某公司笔试题
http://blog.csdn.net/bluishglc/article/details/6161475 数据库Sharding的基本思想和切分策略