阿里巴巴笔试题
1、下面哪一个不是动态链接库的优点?(装载速度快-->静态链接库)
(优点:共享、开发速度快,减少页面交换)
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)
1.最简单的方法:将n个数排序,排序后的前k个数就是最大的k个数,这种算法的复杂度是O(nlogn)
2.O(n)的方法:利用快排的patition思想,基于数组的第k个数来调整,将比第k个数小的都位于数组的左边,比第k个数大的都调整到数组的右边,这样调整后,位于数组右边的k个数最大的k个数(这k个数不一定是排好序的)
3.O(nlogk)的方法:先创建一个大小为k的最小堆,接下来我们每次从输入的n个整数中读入一个数,如果这个数比最小堆的堆顶元素还要大,那么替换这个最小堆的堆顶并调整。
3、由权值分别为1、12、13、4、8的叶子节点生成一颗哈夫曼树,它的带权路径长度为(81)
4、阿里巴巴国际站的股票代码是1688,这个数字具有这样的特性,首先是个首位为1的4位数,其次恰巧有且仅有1个数字出现了两次。类似的数字还有:1861,1668等。这样的数字一共有( )个。1. 重复的是1:
则1的位置有百位十位个位三种, 每种情况下 由于1不能再选, 共9*9 = 81,去掉00到99(不包括11)9个 综上共(81-9)*3 = 216=C(1,3)*A(2,9)
2. 重复的非1:
则首先选定重复的数有0、1到9 9种,此时剩下的一个数有8种情况(非1非选定数),重复的位置有3种情况 共9*8*3 = 216=C(1,3)*C(1,9)*C(1,8)
综上共216+216=432种
排列,就是指从给定n个数的元素中取出指定r个数的元素,进行排序
组合,则是指从给定n个数的元素中仅仅取出指定r个数的元素,不考虑排序
5、工程师M发明了一种游戏:M将一个小球随机放入完全相同的三个盒子中的某一个,玩家选中装有球的盒子即获胜;开始时M会让玩家选择一个盒子(选择任何一个获胜概率均为1/3);玩家做出选择后,M会打开没有被选择的两个盒子中的一个空盒,此时M会询问玩家是否更改选择(可以坚持第一次选择,也可以选择另一个没有打开的盒子),下列叙述正确的有()
三个盒子A,B,C。其中,1表示有球,0表示没球。
选取三个盒子概率都一样。我们假设选择了A。
此时有三种情况如下所示:
情况一:我选中了有球的盒子,我更换的话将失败,不更换的话将成功。
情况二:我选中了没球的盒子,我更换的话将成功,不更换的话将失败。
情况三:我选中了没球的盒子,我更换的话将成功,不更换的话将失败。
综上,我们发现更换了成功的概率是2/3;二不更换成功的概率是1/3。
所以 选择另一个没有被打开的盒子获胜概率更高(玩家选了一个盒子,球在里面的概率和球不在里面的概率,哪个更大。因为球不在里面的话,那就肯定赢了。球在里面1/3,球不在里面2/3。)
6、以下哪种方式,在读取磁盘上多个顺序数据块时的效率最高?
程序直接访问方式(循环检查I/O方式:):最古老的方式。cpu和IO串行,每读一个字节(或字),CPU都需要不断检测状态寄存器的busy标志,当busy=1时,表示IO还没完成;当busy=0时,表示IO完成。此时读取一个字的过程才结束,接着读取下一个字(以字节为单位)
中断控制方式:循环检测先进些,IO设备和CPU可以并行工作,只有在开始IO和结束IO时,才需要CPU。但每次只能读取一个字
DMA方式:直接存储器访问,比中断先进的地方是每次可以读取一个块,而不是一个字(以一个连续的数据块为单位)
通道方式:比DMA先进的地方是,每次可以处理多个块,而不只是一个块(以一组数据块为单位)
通道方式>DMA方式>中断控制方式>程序直接访问方式(循环检测IO方式)
7、下列不是进程间的通信方式的是(回调)
管道:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
回调: 是一种编程机制
共享内存:共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
消息队列:消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
socket:socket也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
8、已知IBM的PowerPC是big-endian字节序列而Intel的X86是little-endian字节序,如果在地址啊存储的整形值时0x04030201,那么地址为a+3的字节内存储的值在PowerPC和Intel X86结构下的值分别是?()
big-endian 大端
little-endian 小端
大端从大地址开始存储,小端相反,两者都是从数据低位开始存起;
假设从上至下地址递增,则
PowerPC(大): Intel X86(小):
04 01 低
03 02 |
02 03 |
01 04 高
a+3指向最大的地址,所以分别为1 4
9、在TCP/IP建立连接过程中,客户端或服务器的状态转移说法错误的是?
TIME_WaiT是断开连接时的状态(属于第四次握手)
经历SYN_RECV状态经历SYN_SEND状态经历ESTABLISHED状态服务器在收到syn包时将加入半连接队列服务器收到客户端的ack包后将从半连接队列删除
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、问题描述 sizeof(bu)的值是( 22 )
#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;
union:当多个数据需要共享内存或者多个数据每次只取其一时,可以利用联合体(union);
它有以下特点:
(1)它是一个结构;
(2)它的所有成员相对于基地址的偏移量都为0;
(3)此结构空间要大到足够容纳最"宽"的成员;
(4)其对齐方式要适合其中所有的成员
综上:
而分配给union的实际大小不仅要满足是对齐大小的整数倍,同时要满足实际大小不能小于最大成员的大小。
本题目中
注意第一行,#pragma pack(2)
首先考虑没有这句话时,我们在类、结构或者union补齐字节的时候,找它们的成员数据中找字节最大的那个数去衡量如何对 齐,假设为z;
但是有了这句话以后,对齐方式是取 pack(n)中n和z的最小值去对齐;
可见本题中对齐字节数为2;
之后往下看 int number; 占4个字节
接下来考虑union大小
union UBffer
{
char buffer[13]; // 13
int number; // 4
}bu;
buffer 是13个字节,number 是4个字节,取最大的 为13,注意还要字节对齐,对齐字节数为2,所以Union大小为14,既满 足buffer的对齐 也满足number的对齐。
void foo(){}:空函数不占取字节
typedef char*(*f) (void*); 未实例化指针不占取字节
enum只是定义了一个常量集合,里面没有“元素”,而枚举类型是当做int来存储的,所以枚举类型的sizeof值都为4
14+4+4+0+0=22;
13、同一个进程中的线程不共享的部分是(栈空间)
线程共享的环境包括:进程代码段、进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)、进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID。
进程拥有这许多共性的同时,还拥有自己的个性。有了这些个性,线程才能实现并发性。这些个性包括:
1.线程ID
每个线程都有自己的线程ID,这个ID在本进程中是唯一的。进程用此来标识线程。
2.寄存器组的值
由于线程间是并发运行的,每个线程有自己不同的运行线索,当从一个线程切换到另一个线程上 时,必须将原有的线程的寄存器集合的状态保存,以便将来该线程在被重新切换到时能得以恢复。
3.线程的堆栈
堆栈是保证线程独立运行所必须的。线程函数可以调用函数,而被调用函数中又是可以层层嵌套的,所以线程必须拥有自己的函数堆栈, 使得函数调用可以正常执行,不受其他线程的影响。栈是线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立,因此,栈是 thread safe 的。
4.错误返回码
由于同一个进程中有很多个线程在同时运行,可能某个线程进行系统调用后设置了errno值,而在该 线程还没有处理这个错误,另外一个线程就在此时被调度器投入运行,这样错误值就有可能被修改。所以,不同的线程应该拥有自己的错误返回码变量。
5.线程的信号屏蔽码
由于每个线程所感兴趣的信号不同,所以线程的信号屏蔽码应该由线程自己管理。但所有的线程都共享同样的信号处理器。
6.线程的优先级
由于线程需要像进程那样能够被调度,那么就必须要有可供调度使用的参数,这个参数就是线程的优先级。
14、下面关于系统调用的描述中,错误的是系统调用中被调用的过程运行在"用户态"中)
系统调用把应用程序的请求传输给系统内核执行
系统调用中被调用的过程运行在"用户态"中 (调用程序是运行在用户态,而被调用的程序是运行在系统态)
利用系统调用能够得到操作系统提供的多种服务
是操作系统提供给编程人员的接口
系统调用给用户屏蔽了设备访问的细节
系统调用保护了一些只能在内核模式执行的操作指令
15、在动态分区分配方案中,系统回收主存,合并空闲空间时需修改空闲区表,以下哪种情况空闲区会减1?
有上邻空闲区,也有下邻空闲区
在分区分配方案中,回收一个分区时有几种不同的邻接情况,在各种情况下应如何处理?
答:有四种:上邻,下邻,上下相邻,上下不相邻。
(1)回收分区的上邻分区是空闲的,需要将两个相邻的空闲区合并成一个更大的空闲区,然后修改空闲区表。
(2)回收分区的下邻分区是空闲的,需要将两个相邻的空闲区合并成一个更大的空闲区,然后修改空闲区表。
(3)回收分区的上、下邻分区都是空闲的(空闲区个数为2),需要将三个空闲区合并成一个更大的空闲区(空闲区个数为1 ),然后修改空闲区表、
(4)回收分区的上、下邻分区都不是空闲的,则直接将空闲区记录在空闲区表中。
16、下面关于虚拟局域网VLAN的叙述错误的是()
不同VLAN内的用户可以相互之间直接通信
VLAN是由局域网网段构成的与物理位置无关的逻辑组
利用以太网交换机可以很方便地实现VLAN
每一个VLAN的工作站可处在不同的局域网中
不同VLAN内的用户可以相互之间直接通信
vLAN可以强化网络安全和网络管理
VLAN能灵活控制广播活动VLAN(virtual local Area Network)的中文名为"虚拟局域网"。
虚拟局域网(VLAN)是一组逻辑上的设备和用户,这些设备和用户并不受物理位置的限制,可以根据功能、部门及应用等因素将它们组织起来,相互之间的通信就好像它们在同一个网段中一样,由此得名虚拟局域网。VLAN是一种比较新的技术,工作在OSI参考模型的第2层和第3层,一个VLAN就是一个广播域,VLAN之间的通信是通过第3层的路由器来完成的。与传统的局域网技术相比较,VLAN技术更加灵活,它具有以下优点: 网络设备的移动、添加和修改的管理开销减少;可以控制广播活动;可提高网络的安全性。
在计算机网络中,一个二层网络可以被划分为多个不同的广播域,一个广播域对应了一个特定的用户组,默认情况下这些不同的广播域是相互隔离的。不同的广播域之间想要通信,需要通过一个或多个路由器。这样的一个广播域就称为VLAN。
17、刚毕业的小王上班有两路公交车都可以从家到公司.如果只等A车,平均需要5分钟才等到;如果只等B车,平均需要7分钟才能等到.假定两辆车运行时间独立,那么小王平均需要等多长时间才能等到A车或B车?( 2.55 )
时间段t内A车 t/5趟,B车 t/7趟,所以在t内等到车共计t/5+t/7趟,等到一趟的时间则为t/(t/5+t/7),等价35/12
18、一个黑色袋子中装有5个红球,5个蓝球,5个黄球,从中抽取三次,每次抽一个球,取完不放回,则每种颜色球各得一个的概率是()
5/15 * 5/14 *5/13=25/91
19、以下程序的运行结果是:
int* pint = 0;
pint += 6;
cout << pint << endl;
第一句的意思是将pint指针指向0地址处,由于指针类型是int,每次加1相当于移动四个字节,(在int为四个字节的机器上);加上6,地址为0x18=24
20、某种5号(AA)充电电池在充满电之后的电量是900毫安时和1100毫安时的可能性各为1/2。如果将将电池串联使用,常常会因为其中一部分电池先放电完毕,而且其它电池还有100毫安时以上的电量时,引起先放完电的电池损坏。那么以下说法正确的是:
如果放电电量控制在900毫安时以内,则不会有电池损坏
ARP:TCP/IP模型中,ARP协议属于网络层,在OSI参考模型中,ARP属于数据链路层
ICMP:网络层
FTP:应用层
UDP:传输层
HTTP:应用层
VPN:目前VPN隧道协议主要有4种:点到点隧道协议PPTP、第二层隧道协议L2TP、网络层隧道协议IPSec以及SOCKS v5协议。
其中,PPTP和L2TP工作在数据链路层,IPSec工作在网络层,SOCK v5工作在会话层。
22、一组记录排序码为(5 11 7 2 3 17),则利用堆排序方法建立的初始堆为(17 11 7 2 3 5)
构造初始堆,则从最后一个非叶节点开始调整,调整过程如下:
这样就得到了初始堆。
即每次调整都是从父节点、左孩子节点、右孩子节点三者中选择最大者跟父节点进行交换(交换之后可能造成被交换的孩子节点不满足堆的性质,因此每次交换之后要重新对被交换的孩子节点进行调整)。有了初始堆之后就可以进行排序了
23、甲乙丙三人是阿里巴巴开发人员,ABC三人是阿里巴巴测试人员,每个开发都有对应的测试人员。主管介绍说:“A对应的开发是乙的好友,并在三个开发中最年轻;丙的年龄比C对应的开发大。”则开发和测试的对应关系为(甲-A,乙-C,丙-B)
24、某机器人可以说真话或者假话。某程序设定其周末(周六周日)说真话,周四说谎话,其他日期随机。某测试打算验证该功能。他连续七天,每天问机器人“你在哪里出生的?”,在前六天得到了这样的答案:阿里,淘宝,阿里,淘宝,天猫,淘宝。那么第七天,机器人的回答应该是)
周六周日说真话,所以有连续两天的答案是一样的所以只有第一天是周日才可能有这种情况,顾答案是阿里
相关阅读
主要参考:网络编程懒人入门(一):快速理解网络通信协议(上篇) 几种计算机网络体系结构 互联网的实现,分成好几层。每一层都有自己的功
对于很多使用win8操作系统的用户来说,普通电脑的键盘式操作方式难以满足正常的使用,而win8操作系统更加适合触屏的操作方式。现在最
在当前经济形势
恩……..这道题,我们来看一下,首先得明白,什么是静态变量,什么是实例变量! 看下面这个代码 class Demo1{ //静态变量 public
发现没有?我们的衣食住行已经被嘀嘀打车、同程网、蘑菇街、音悦台、虾米网等等这些耳熟能详的互联网产品占据了!而他们的创始人,竟然