一、单向选择题
1、在常用的网络协议中,___B__是面向连接的、有重传功能的协议。
A. IP B. TCP C. UDP D. DXP
2、500张骨牌整齐地排成一行,按顺序编号为1、2、3、......、499、500,第一次拿走所有奇数位置上的骨牌,第二次再从剩余骨牌中拿走所有奇数位置上的骨牌,依次类推,请问最后剩下的一张骨牌的编号为__C_。
A. 128 B. 250 C. 256 D. 500
解析:
第一次后剩下250个偶数:2,4,6,8......498,500
将它们除以2得到1-250的一列
第二次后剩下125个偶数:2,4,6,8......248,250
将它们除以2得到1-125的一列
第三次后剩下62个偶数2,4,6,8.......122,124
将它们除以2得到1-62的一列
第四次后剩下31个偶数2,4,6,8......60,62
将它们除以2得到1-31的一列
同理,第五次后到15 第六次除后到7 第七次除后到3 第八次除后最后一张
所以,它的编号为1*2^8=256
3、两个线程并发执行以下代码,假设a是全局变量,初始值为1,那么以下输出中__D__是不可能的。
1 void foo()
2
3 {
4
5 ++a;
6
7 printf(“%d_”,a);
8
9 }
A. 3_2_ B. 2_3_ C. 3_3_ D. 2_2_
解析:
对于A选项:我开始也觉得不对,但我同学深入到汇编去分析:
听着有些道理,但还是不确定!
对于B选项:线程1先执行++a,此时a=2,然后线程1输出;线程2执行++a,此时a=3,最后线程2输出;
对于C选项:线程1先执行++a,此时a=2,然后中断,线程2执行++a,此时a=3,线程2输出,最后线程1输出;
对于D选项:这个是不可能的。
4、某系统采用36进制数字来表示一个字符串,36个字符0-9,a-z分别由数字0-35表示,则10进制数字872581表示字符串___B___。
A. imc B. ipad C. iphone D. ipod
解析:(872581)10=(18 25 10 13)36,所以为ipad
5、以下代码输出的结果是:___B___
A. 81 B. 27 C. 9 D. 3
6、关于数据结构的以下说法,错误的是___C___。
A. 红黑树插入操作的平均时间复杂度为O(logn),最坏时间复杂度为O(logn)
B. B+树插入操作的平均时间复杂度为O(logn),最坏时间复杂度为O(logn)
C. Hash表插入操作的平均时间复杂度为O(logn),最坏时间复杂度为O(n)
D. 排序链表插入操作的平均时间复杂度为O(n),最坏时间复杂度为O(n)
解析:
Hash表的查找、插入和删除都是O(1)。
7、哈夫曼编码是一种无损二进制熵编码算法,其加权路径长度最小,字符串“alibaba”的二进制哈夫曼编码有___C__位(bit)。
A. 11 B. 12 C. 13 D. 14
解析:
a的个数为3,b的个数为2,l的个数为1,i的个数为1。
最后构造的哈夫曼树,编码如下所示。
编码: 个数
a:1 3
b:01 2
l:000 1
i:001 1
所以,哈夫曼编码长度为:3*1 + 2*2 + 3*1 + 3*1 = 13。
8、节点按中序遍历为xyz的二叉树可能有__D__种。
A. 2 B. 3 C. 4 D. 5
解析:
注意左右子树的问题就OK了。
9、在4个元素的集合上可定义的互不相同的划分有___B___种。
A. 14 B. 15 C. 16 D. 17
解析:
集合A的一个划分确定A的元素间的一个等价关系。
如果划分为4个子集,只有一种划分;
如果划分为3个子集,那么三个子集的元素必须是1、1、2个。有C(4,2)=6种划分;
如果划分为2个子集,那么可能是1+3,也可能是2+2.在1+3的情况,有四种方法去选择集合的元素,所有有4种。如果是2+2,有C(4,2)=3种。所以,总共有7种两个子集的划分;
如果划分为1个子集,只有一种划分;
所以,总共有1+6+7+1 = 15种划分。
10、以下关于C语言中指针的说法错误的是:___B_。
A. 指针的值是一个地址
B. 非法指针是指该指针的值不是一个已经分配内存的地址
C. 两个指向同类型地址的指针之间做减法是没有意义的
D. 指针的指针占用的内存空间和其他指针占用的内存空间相同
解析:B。非法指针是指指针指向已经被回收或者指向一个错误的地址,题中的表述不完整。
C的话,两个地址值相减,所得的结果只有天知道,没有意义。
补充:所有类型的指针的大小都是一样的,因为它所存的只是一个地址,而这个地址是固定的,一般都是4个字节。可以用sizeof函数试一下。所以A、D是正确的。
二、不定向选择题
参考答案:BE。纯数学题啊,大阿里真有你的。。。
B是对的,举不出反例;空集是空集的子集,但不是真子集,所以E是对的。其他几项都可以举出错误的例子。
参考答案:AB。水题不解释。
13、以下关于内存泄露的说法正确的是___C__。
A. 内存泄露是操作系统内存管理出错导致的问题
B. 单线程程序不可能内存泄露
C. 如果一个进程在运行过程中占用的内存无限制的上升,那么该进程有内存泄露
D. 只要进程在退出之前释放了所有分配的内存,那么就不会有内存泄露
E. 内存泄露仅仅出现在C/C++程序的问题,Java程序不会出现内存泄露
解析:
对于A选项,内存泄露通常是指分配出去的内存使用完毕后没有释放掉,未被回收,所以,A应该不对。
对于B选项,肯定是不对的,单线程也会出现内存泄露;
对于E选项,肯定是不对的,Java程序也会出现内存泄露的问题;
对于D选项,不确定,但“只要”的表述总觉得不对。
14、关于进程和线程,下面说法正确的是__BCD__
A. 线程是资源分配和拥有的单位
B. 线程和进程都可以并发执行
C. 在linux系统中,线程是处理器调度的基本单位
D. 线程的粒度小于进程,通常多线程比多进程并发性更高
E. 不同的线程共享相同的栈空间
解析:
对于A选项,进程是系统资源分配和调度的基本单位;而线程是处理器调度的基本单位;
对于E选项,应该是属于同一进程的不同线程共享相同的栈空间;
第三部分 填空与问题
参考答案:O(log2(n))。
16、某种物理机一年的无故障概率为p,每台物理机通过虚拟技术可以虚拟出v台虚拟机,假定在物理机没出现故障的情况下虚拟机不会出现故障,那么每台虚拟机一年无故障的概率为___p___。如果有m台这样的物理机,虚拟出mv台虚拟机,通过某种分布式容错技术,可以使基于这些虚拟机搭建的服务只要有一台虚拟机无故障,这个服务便可以无故障。那么这个服务一年的无故障概率为__1-(1-p)^mv_。如果想通过同样数量的虚拟机实现更高的无故障概率,但不限制物理机的数量,可以采用的方法是_增加每台物理机虚拟出的虚拟机数量_。
解析:v值越大,1-(1-p)^mv的值越大,即这个服务一年的无故障概率越高。
17、宿舍内5个同学一起玩对战游戏,每场比赛有一些人作为红方,另一些人作为蓝方,请问至少有多少场比赛,才能使任意两个人之间有一场红方对蓝方和一场蓝方对红方的比赛?请写出思路及结果。
参考答案:4场
分析:一次划分中,某方可以有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场比赛
18、读取并处理一个文件中的记录,每条记录处理会产生一个对应的结果,不同记录的处理过程之间互不依赖,结果输出到另一个文件中,某程序员实现了该处理程序的单线程版本,运行时发现CPU使用率达到80%。
(1)为何CPU使用率不是100%?
(2)假定程序运行的机器的核数在4到16不等,如何设计程序,使该处理程序运行的最快?
(3)在一个n核机器上,速度最快是原来的程序的多少倍?
解析:
(1)CPU使用率达不到100%,有可能是CPU分配给该进程的时间片用完,其他进程抢占了CPU,从而导致该程序阻塞;
(2)假设该机器的核数为n,其中4<=n<=16,以及文件中有m条记录,那么可以创建n个线程,每个线程并发 最多 处理不同的m/n+1(取整加1)条记录,这样会使该处理程序运行的最快;
(3)最多为n倍。
19、请实现一个程序,能对点分字符串按段翻转。如”www.taobao.com”翻转为”com.taobao.www”,”sports.sina.com.cn”翻转为”cn.com.sina.sports”。要求时间复杂度为O(n),空间复杂度为O(1),结果保存在参数指针所指的空间中。
解析:
解决方法是这样的,分为两步:
(1)首先将整个字符串逐个反转,例如www.taobao.com 处理后就是 moc.oaboat.www;
(2)再在段内进行一次反转,结果就是com.taobao.www了;
1 void Swap(char *a, char *b)
2 {
3 char tmp = *a;
4 *a = *b;
5 *b = tmp;
6 }
7 void reverse(char *str, int first, int last)
8 {
9 if(str == NULL || first > last){
10 return;
11 }
12 int i = first, j = last;
13 while(i < j){
14 Swap(&str[i], &str[j]);
15 i++;
16 j--;
17 }
18 }
19 char* RerveAll(char *str)
20 {
21 if(str == NULL){
22 return NULL;
23 }
24 //反转整个字符串
25 reverse(str, 0, strlen(str) - 1);
26 //段内逐步反转
27 size_t i = 0;
28 int istart = 0;
29 for(i = 0; i < strlen(str); i++){
30 if(str[i] == '.')
31 {
32 reverse(str, istart, i - 1);
33 istart = i + 1;
34 }
35 }
36 //最后一个'.'后面的字符串
37 reverse(str, istart, i - 1);
38 return str;
39 }
第四部分 综合题
某B2C网站有1亿用户和200万商品,每一个用户都有自己喜欢的若干件商品,如果两个用户都喜欢同一件商品,我们定义中两个用户有一个“同好商品”,“同好度”为两个用户的同好商品数和这两个用户中至少有一人喜欢的商品数的比值。同好度衡量了两个用户之间的商品喜好的接近程序,这有着十分重要的用途。
请设计一个算法,计算每一个用户的同好用户集合及同好度。
输入数据:多个文件,每个文件的数据有多行,每一行的数据格式如下:用户ID喜欢的商品ID1 喜欢的商品ID2 .......喜欢的商品n,其中用户ID和商品ID均为32位整数,中间以空格分隔。
如:
16 1001 1002 3003
输出数据:一个或多个文件,每一行的数据格式如下:
用户ID 同好用户ID1:同好度 同好用户ID2:同好度......同好用户IDn:同好度
中间以空格隔开。算法可以描述为伪代码。