阿里巴巴2017实习生笔试题 (二)

今天做了一下题,发现确实好多不懂啊,没有特别怪的题,错题总结一下

1.下面哪一个不是动态链接库的优点?
正确答案: B   你的答案: D (错误)
A 共享
B 装载速度快
C 开发模式好
D 减少页面交换

动态连接库需要寻址操作才能确定其中调用的函数,而静态链接库中的函数在编译时就确定了调用 的函数,因此,在效率上,动态库比较慢.

2.n个数值选出最大m个数(3<m<n)的最小算法复杂度是
正确答案: A   你的答案: D (错误)
A O(n)
B O(nlogn)
C O(logn)
D O(mlogn)
E O(nlogm)
F O(mn)

1.最简单的方法:将n个数排序,排序后的前k个数就是最大的k个数,这种算法的复杂度是O(nlogn)
2.O(n)的方法:利用快排的patition思想,基于数组的第k个数来调整,将比第k个数小的都位于数组的左边,比第k个数大的都调整到数组的右边,这样调整后,位于数组右边的k个数最大的k个数(这k个数不一定是排好序的)
3.O(nlogk)的方法:先创建一个大小为k的最小堆,接下来我们每次从输入的n个整数中读入一个数,如果这个数比最小堆的堆顶元素还要大,那么替换这个最小堆的堆顶并调整。

3.阿里巴巴国际站的股票代码是1688,这个数字具有这样的特性,首先是个首位为14位数,其次恰巧有且仅有1个数字出现了两次。类似的数字还有:1861,1668等。这样的数字一共有()个。
正确答案: F   你的答案: 空 (错误)
A 144
B 180
C 216
D 270
E 288
F 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

4.工程师M发明了一种游戏:M将一个小球随机放入完全相同的三个盒子中的某一个,玩家选中装有球的盒子即获胜;开始时M会让玩家选择一个盒子(选择任何一个获胜概率均为1/3);玩家做出选择后,M会打开没有被选择的两个盒子中的一个空盒,此时M会询问玩家是否更改选择(可以坚持第一次选择,也可以选择另一个没有打开的盒子),下列叙述正确的有()。
正确答案: E   你的答案: F (错误)
A 改选后,玩家获胜的概率还是1/3
B 若不改选,玩家的获胜概率是1/2
C 无论怎么选择,获胜的概率都是1/2
D 坚持原来的选择获胜概率更高
E 选择另一个没有被打开的盒子获胜概率更高
F 获胜概率取决于随机因素(如小球的实际位置)

不会,先空着

5.以下哪种方式,在读取磁盘上多个顺序数据块时的效率最高?
正确答案: C   你的答案: D (错误)
A 中断控制方式
B DMA方式
C 通道方式
D 程序直接访问方式
E 循环检查I/O方式
F 以上访问方式都一样

(1)程序直接访问方式跟循环检测IO方式,应该是一个意思吧,是最古老的方式。CPU和IO串行,每读一个字节(或字),CPU都需要不断检测状态寄存器的busy标志,当busy=1时,表示IO还没完成;当busy=0时,表示IO完成。此时读取一个字的过程才结束,接着读取下一个字。
(2)中断控制方式:循环检测先进些,IO设备和CPU可以并行工作,只有在开始IO和结束IO时,才需要CPU。但每次只能读取一个字。
(3)DMA方式:Direct Memory Access,直接存储器访问,比中断先进的地方是每次可以读取一个块,而不是一个字。
(4)通道方式:比DMA先进的地方是,每次可以处理多个块,而不只是一个块。

6.列不是进程间的通信方式的是()
正确答案: B   你的答案: C (错误)
A 管道
B 回调
C 共享内存
D 消息队列
E socket
F 信号量

选B
管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
信号量( semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
消息队列( message queue ) : 消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
套接字( socket ) : 套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信。
回调: 是一种编程机制。

7.已知IBM的PowerPC是big-endian字节序列而Intel的X86是little-endian字节序,如果在地址啊存储的整形值时0x04030201,那么地址为a+3的字节内存储的值在PowerPC和Intel X86结构下的值分别是?
正确答案: A   你的答案: 空 (错误)
A 1 4
B 1 3
C 4 1
D 3 1
E 4 4
F 1 1

大端从大地址开始存储,小端相反,两者都是从数据低位开始存起;
假设从上至下地址递增,则
PowerPC(大): Intel X86(小):
04 01 低
03 02 |
02 03 |
01 04 高
a+3指向最大的地址,所以分别为1 4

8.在TCP/IP建立连接过程中,客户端或服务器的状态转移说法错误的是?
正确答案: D   你的答案: A (错误)
经历SYN_RECV状态
经历SYN_SEND状态
经历ESTABLISHED状态
经历TIME_WAIT状态
服务器在收到syn包时将加入半连接队列
服务器收到客户端的ack包后将从半连接队列删除

Tcp/Ip有3次握手:第一次握手:客户端向服务器端发送SYN包(syn=j),进入SYN_SEND状态,等待服务器确认。第二次握手:服务器收到SYN包,确认SYN,此时syn=j+1,同时发送一个SYN包(syn=k)即SYN+ACK包,此时服务器进入SYN_RECV状态;第三次握手:客户端收到SYN+ACK包,向服务器发送ACK确认包,此时客户端和服务器端均进入ESTABLISHED状态。
其中有一个半连接状态:服务器维护一个半连接队列,该队列卫每个客户端SYN包开设一个条目,标明服务器已经接到SYN包,并向客户端发出确认,这些条目表示的连接处于SYN_RECV状态,得到客户端的确认后进入ESTABLISHED状态。

9.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)的值是()
正确答案: C   你的答案: F (错误)
20
21
22
23
24
非以上选项

注意第一行,#pragma pack(2)
首先考虑没有这句话时,我们在类、结构或者union补齐字节的时候,找它们的成员数据中找字节最大的那个数去衡量如何对齐,假设为z;
但是有了这句话以后,对齐方式是取 pack(n)中n和z的最小值去对齐;
可见本题中对齐字节数为2;
之后往下看 int number; 占4个字节
接下来考虑union大小
union UBffer
{
char buffer[13]; // 13
int number; // 4
}ubuf; buffer 是13个字节,number 是4个字节,取最大的 为13,注意还要字节对齐,对齐字节数为2,所以Union大小为14,既满足buffer的对齐 也满足number的对齐。
void foo(){} 不占
typedef char*(f)(void); 不占
enum{hdd,ssd,blueray}disk; 4个字节

 综上,总大小为14+4+0+0 +4=22
10.同一个进程中的线程不共享的部分是()
正确答案: F   你的答案: C (错误)
a 信号
b 堆
c 文件描述符
d 进程组id
e 代码段
f 栈空间     

线程共享的环境包括:进程代码段、进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)、进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID。

进程拥有这许多共性的同时,还拥有自己的个性。有了这些个性,线程才能实现并发性。这些个性包括:

1.线程ID

每个线程都有自己的线程ID,这个ID在本进程中是唯一的。进程用此来标识线程。

2.寄存器组的值

由于线程间是并发运行的,每个线程有自己不同的运行线索,当从一个线程切换到另一个线程上 时,必须将原有的线程的寄存器集合的状态保存,以便将来该线程在被重新切换到时能得以恢复。

3.线程的堆栈

堆栈是保证线程独立运行所必须的。线程函数可以调用函数,而被调用函数中又是可以层层嵌套的,所以线程必须拥有自己的函数堆栈, 使得函数调用可以正常执行,不受其他线程的影响。

4.错误返回码

由于同一个进程中有很多个线程在同时运行,可能某个线程进行系统调用
后设置了errno值,而在该 线程还没有处理这个错误,另外一个线程就在此时
被调度器投入运行,这样错误值就有可能被修改。 所以,不同的线程应该拥有自己的错误返回码变量。

5.线程的信号屏蔽码

由于每个线程所感兴趣的信号不同,所以线程的信号屏蔽码应该由线程自己管理。但所有的线程都共享同样的信号处理器。

6.线程的优先级

由于线程需要像进程那样能够被调度,那么就必须要有可供调度使用的参数,这个参数就是线程的优先级。

栈: 是个线程独有的,保存其运行状态和局部自动变量的。栈在线程开始的时候初始化,每个线程的栈互相独立,因此,栈是 thread safe 的。

11.下面关于系统调用的描述中,错误的是()
正确答案: B   你的答案: B (正确)
系统调用把应用程序的请求传输给系统内核执行
系统调用中被调用的过程运行在"用户态"中
利用系统调用能够得到操作系统提供的多种服务
是操作系统提供给编程人员的接口
系统调用给用户屏蔽了设备访问的细节
系统调用保护了一些只能在内核模式执行的操作指令

调用程序是运行在用户态,而被调用的程序是运行在系统态

12.在动态分区分配方案中,系统回收主存,合并空闲空间时需修改空闲区表,以下哪种情况空闲区会减1?
正确答案: F   你的答案: 空 (错误)
只要回收主存,空闲区数就会减一
空闲区数和主存回收无关
无上邻空闲区,也无下邻空闲区
有上邻空闲区,但无下邻空闲区
有下邻空闲区,但无上邻空闲区
有上邻空闲区,也有下邻空闲区

在分区分配方案中,回收一个分区时有几种不同的邻接情况,在各种情况下应如何处理? 答:有四种:上邻,下邻,上下相邻,上下不相邻。
(1)回收分区的上邻分区是空闲的,需要将两个相邻的空闲区合并成一个更大的空闲区,然后修改空闲区表。
(2)回收分区的下邻分区是空闲的,需要将两个相邻的空闲区合并成一个更大的空闲区,然后修改空闲区表。
(3)回收分区的上、下邻分区都是空闲的(空闲区个数为2),需要将三个空闲区合并成一个更大的空闲区(空闲区个数为1 ),然后修改空闲区表、
(4)回收分区的上、下邻分区都不是空闲的,则直接将空闲区记录在空闲区表中。

13.int* pint = 0; 
pint += 6; 
cout << pint << endl;
以上程序的运行结果是:
正确答案: C   你的答案: D (错误)
12
72
24
0
6
任意数

第一句的意思是将pint指针指向0地址处,由于指针类型是int,每次加1相当于移动四个字节,(在int为四个字节的机器上);加上6,地址为0x18,指向地址零加6,int是4位地址,值为24
ICMP是网络层,UDP是传输层,FTP和HTTP是应用层 目前VPN隧道协议主要有4种:点到点隧道协议PPTP、第二层隧道协议L2TP、网络层隧道协议IPSec以及SOCKS v5协议。其中,PPTP和L2TP工作在数据链路层,IPSec工作在网络层,SOCK v5工作在会话层。TCP/IP模型中,ARP协议属于网络层,在OSI参考模型中,ARP属于数据链路层

猜你喜欢

转载自blog.csdn.net/wuhuimin521/article/details/81008014