阿里巴巴2017实习生笔试题(二) 2024/12/25
1.下面哪一个不是动态链接库的优点? B
A.共享
B.装载速度快
C.开发模式好
D.减少页面交换
解析
1 静态链接库的优点
(1) 代码装载速度快,执行速度略比动态链接库快;
(2) 只需保证在开发者的计算机中有正确的.LIB文件,在以二进制形式发布程序时不需考虑在用户的计算机上.LIB文件是否存在及版本问题,可避免DLL地狱等问题。
2 动态链接库的优点
(1) 更加节省内存并减少页面交换;
(2) DLL文件与EXE文件独立,只要输出接口不变(即名称、参数、返回值类型和调用约定不变),更换DLL文件不会对EXE文件造成任何影响,因而极大地提高了可维护性和可扩展性;
(3) 不同编程语言编写的程序只要按照函数调用约定就可以调用同一个DLL函数;
(4)适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试。
3 不足之处
(1) 使用静态链接生成的可执行文件体积较大,包含相同的公共代码,造成浪费;
(2) 使用动态链接库的应用程序不是自完备的,它依赖的DLL模块也要存在,如果使用载入时动态链接,程序启动时发现DLL不存在,系统将终止程序并给出错误信息。而使用运行时动态链接,系统不会终止,但由于DLL中的导出函数不可用,程序会加载失败;速度比静态链接慢。当某个模块更新后,如果新模块与旧的模块不兼容,那么那些需要该模块才能运行的软件,统统撕掉。这在早期Windows中很常见。
2.n个数值选出最大m个数(3<m<n)的最小算法复杂度是O(n)
解析
使用快速选择(Quickselect)算法,可以找到第m大的元素,平均复杂度为O(n),最坏情况下为O(n^2)。一旦找到第m大的元素,我们可以通过一次遍历将前m个元素选出。这种方法的复杂度为O(n)。
使用快速排序来寻找第m大的元素可以通过一种变体的算法,通常称为快速选择或。这个算法的基本思想如下:
-
分区(Partition):选择一个枢轴(pivot),将数组分成两部分,左边部分的元素都小于等于枢轴,右边部分的元素都大于枢轴。
-
递归选择:
- 如果枢轴的索引正好是我们想要的m(或n-m+1,如果我们要找第m小的元素),我们就找到了目标元素。
- 如果枢轴的索引大于m(或n-m+1),则在枢轴左边的子数组中继续寻找。
- 如果枢轴的索引小于m(或n-m+1),则在枢轴右边的子数组中继续寻找。
下面是使用Python实现这个算法的伪代码
python
import random
def quickselect(arr, m):
if len(arr) == 1:
return arr[0]
# 选择一个随机的枢轴
pivot = random.choice(arr)
# 分区
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
# 选择下一个递归的子数组
if m <= len(right):
return quickselect(right, m)
elif m > len(arr) - len(left):
return quickselect(left, m - (len(arr) - len(left)))
else:
return pivot
# 示例:从数组中找出第5大的元素(即第(n-5)小的元素)
arr = [3, 2, 1, 5, 6, 4]
m = 5
print(f"第 {m} 大的元素是: {quickselect(arr, m)}")
3.由权值分别为1、12、13、4、8的叶子节点生成一颗哈夫曼树,它的带权路径长度为(81)
4.阿里巴巴国际站的股票代码是1688,这个数字具有这样的特性,首先是个首位为1的4位数,其次恰巧有且仅有1个数字出现了两次。类似的数字还有:1861,1668等。这样的数字一共有(432)个。
解析
(1)若这个四位数的重复数字为1,那么首先从三个空位中选出一个给1,第二步从剩下9个可选数字中选出2个有序的排列到剩下的两个空位中去,那么有C(1,3)*A(2,9)=3*(9!/(9-2)!)=3*9*8=216种可能;
(2)若这个四位数的重复数字不为1,那么首先从9个可选数字中选出一个作为重复数字(C(1,9)),并放到三个空位中的两个(这两个数字相同,故只涉及组合)(C(2, 3)),然后从剩下8个数字中选出一个(它的位置在重复数字确定后就自然固定了,不可选)即可,故有C(1,9)*C(2, 3)*C(1, 8)=216种可能。
总共:216+216=432
5.工程师M发明了一种游戏:M将一个小球随机放入完全相同的三个盒子中的某一个,玩家选中装有球的盒子即获胜;开始时M会让玩家选择一个盒子(选择任何一个获胜概率均为1/3);玩家做出选择后,M会打开没有被选择的两个盒子中的一个空盒,此时M会询问玩家是否更改选择(可以坚持第一次选择,也可以选择另一个没有打开的盒子),下列叙述正确的是(选择另一个没有被打开的盒子获胜概率更高)。
解析
三门问题-蒙特卡洛问题
情况一:我选中了有球的盒子,我更换的话将失败,不更换的话将成功。
情况二:我选中了没球的盒子,我更换的话将成功,不更换的话将失败。
情况三:我选中了没球的盒子,我更换的话将成功,不更换的话将失败。
综上,我们发现更换了成功的概率是2/3;二不更换成功的概率是1/3。
6.以下哪种方式,在读取磁盘上多个顺序数据块时的效率最高?C
A.中断控制方式
B.DMA方式
C.通道方式
D.程序直接访问方式
E.循环检查I/O方式
F.以上访问方式都一样
解析
(1)程序直接访问方式跟循环检查I/O方式,应该是一个意思吧,是最古老的方式。CPU和IO串行,每读一个字节(或字),CPU都需要不断检测状态寄存器的busy标志,当busy=1时,表示IO还没完成;当busy=0时,表示IO完成。此时读取一个字的过程才结束,接着读取下一个字。
(2)中断控制方式:循环检测先进些,IO设备和CPU可以并行工作,只有在开始IO和结束IO时,才需要CPU。但每次只能读取一个字。
(3)DMA方式:Direct Memory Access,直接存储器访问,比中断先进的地方是每次可以读取一个块,而不是一个字。
(4)通道方式:比DMA先进的地方是,每次可以处理多个块,而不只是一个块。
7.下列不是进程间的通信方式的是(B)
A.管道
B.回调
C.共享内存
D.消息队列
E.socket
F.信号量
解析
管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
8.已知IBM的PowerPC是big-endian字节序列而Intel的X86是little-endian字节序,如果在地址啊存储的整形值时0x04030201,那么地址为a+3的字节内存储的值在PowerPC和Intel X86结构下的值分别是? 1 4
9.在TCP/IP建立连接过程中,客户端或服务器的状态转移说法错误的是(D)
A.经历SYN_RECV状态
B.经历SYN_SEND状态
C.经历ESTABLISHED状态
D.经历TIME_WAIT状态
10.已知一棵二叉树的先序和中序遍历序列如下:先序:A、B、C、D、E、F、G、H、I,J中序:C、B、A、E、F、D、I、H、J、G其后序遍历序列为:C、B、F、E、I、J、H、G、D、A
11.设有四个元素A、B、C、D顺序进栈,在进栈过程中可以出栈,出栈次序错误的排列是DCAB
12.问题描述:
|-------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 | #pragma pack(2)
class
BU
{
``int
number;
``union
UBffer
``{
``char
buffer[13];
``int
number;
``}ubuf;
``void
foo(){}
``typedef
char``*(*f)(``void``*);
``enum``{hdd,ssd,blueray}disk;
}bu;
|
sizeof(bu)的值是(22)
解析
#pragma pack(2)表示对齐设定为2字节
union的大小取决于它所有的成员中,占用空间最大的一个成员的大小,并且需要内存对齐,这里因为#pragma pack(2),所以union的大小为14,如果不写#pragma pack(2),那么union大小为16【因为与sizeof(int)=4对齐】 void foo(){} //0 typedef char*(*f)(void*); //0 enum{hdd,ssd,blueray}disk; // 4 }bu;
因此sizeof(union) = 4+14 +0 +0 +4 = 22
13.同一个进程中的线程不共享的部分是(F)
A.信号
B.堆
C.文件描述符
D.进程组id
E.代码段
F.栈空间
14.下面关于虚拟局域网VLAN的叙述错误的是(D)
A.VLAN是由局域网网段构成的与物理位置无关的逻辑组
B.利用以太网交换机可以很方便地实现VLAN
C.每一个VLAN的工作站可处在不同的局域网中
D.不同VLAN内的用户可以相互之间直接通信
E.VLAN可以强化网络安全和网络管理
F.VLAN能灵活控制广播活动
解析
VLAN的主要目的之一就是隔离网络流量,不同VLAN之间的通信需要通过路由器或者配置了VLAN间路由功能的设备(如三层交换机)来实现。直接通信是不可能的,除非这些设备配置了相应的路由策略或使用了如VTP(VLAN Trunking Protocol)这样的协议来管理VLAN间的通信。
15.刚毕业的小王上班有两路公交车都可以从家到公司。如果只等A车,平均需要5分钟才等到;如果只等B车,平均需要7分钟才能等到。假定两辆车运行时间独立,那么小王平均需要等多长时间才能等到A车或B车? 2分55秒
解析
16.一个黑色袋子中装有5个红球,5个蓝球,5个黄球,从中抽取三次,每次抽一个球,取完不放回,则每种颜色球各得一个的概率是(25/91)
17.以下程序的输出结果是(24)
|-------------|------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 | #include <stdio.h>
int
main() {
``int``* pint = ``0``;
``pint += ``6``;
``printf(``"%d\n"``, pint);
}
|
解析
第一句的意思是将pint指针指向0地址处,由于指针类型是int,每次加1相当于移动四个字节,(在int为四个字节的机器上)
18.某种5号(AA)充电电池在充满电之后的电量是900毫安时和1100毫安时的可能性各为1/2。如果将将电池串联使用,常常会因为其中一部分电池先放电完毕,而且其它电池还有100毫安时以上的电量时,引起先放完电的电池损坏。那么以下说法正确的是:C
A.如果两节这样的电池串联使用,那么必然有1节电池会损坏。
B.如果有许多节这样的电池串联使用,则至少会有1节电池会损坏。
C.如果放电电量控制在900毫安时以内,则不会有电池损坏
D.当有2n节电池串联使用时,至多会有n节电池会损坏
E.当串联的电池个数是奇数时,不会有电池损坏。
F.电量少的电池一定会损坏。
19.下面哪种协议在数据链路层?F
A.ARP
B.ICMP
C.FTP
D.UDP
E.HTTP
F.VPN
解析
ICMP、ARP是网络层,UDP是传输层,FTP和HTTP是应用层