阿里巴巴2018实习生招聘 练习题

 

1.平均速度最快的排序算法是?

AShell排序       B快速排序       C冒泡排序         D插入排序

think:

排序法平均时间最差情形稳定度额外空间
冒泡O(n^2)O(n^2)稳定O(1)
交换O(n^2)O(n^2)不稳定O(1)
选择O(n^2)O(n^2)不稳定O(1)
插入O(n^2)O(n^2)稳定O(1)
基数O(logRB)O(logRB)稳定O(n)
Shel lO(nlogn)~O(n^2)O(n^s) 1<s<2不稳定O(1)
快速O(nlogn)O(n^2)不稳定O(logn)
归并O(nlogn)O(nlogn)稳定O(n)
O(nlogn)O(nlogn)不稳定O(1)

O(n)这样的标志叫做渐近时间(空间)复杂度,是个近似值.各种渐近时间(空间)复杂度由小到大的顺序如下:

                             O(1) < O(logn) < O(n) < O(nlogn) < O(n^2) < O(n^3) < O(2^n) < O(n!) < O(n^n)

看表格可知,快排的平均时间复杂度最低

正确答案 :B

 

2.已有变量定义和函数调用语句,

int a=25;
print_value(&a);
则下面函数的正确输出结果是______。
void print_value(int* x)
{
    printf(“%x\\n”,++*x);
}

      A25          B26         C19        D1a

think:

printf(“%x\n”,++*x); 先把x的值加上1再16进制输出。

正确答案 :D       您的答案 :B

 

3.下面所述步骤中,不是创建进程所必须的步骤是?

A由调度程序为进程分配CPU

B建立一个进程控制块

C为进程分配内存

D将进程控制块链入就绪队列

think:创建进程的步骤:

1,申请空白PCB(进程控制块);->2,为新进程分派资源;->3,初始化PCB;->4,将新进程插入就绪队列;

正确答案 :A     您的答案 :A

 

4.假定x=500,求下面函数的返回值______ 。

int fun(int x)
{
    int countx = 0;
    while (x)
    {
        countx++;
        x = x & (x – 1);
    }
    return countx;
}

         A2           B3           C5         D6

think:

num & (num-1) 可以每次将最右边的1消去,经过x次运算即可。

与x-1进行一次与(&)操作,就会导致x二进制中的1减少一个。通过函数fun可知,x二进制中有多少位1就会进行多少次与计算。

500的二进制表示是:111110100,共有6个1。所以答案是6。

正确答案 :D        您的答案 :C

 

5.10个相同的糖果,分给三个人,每个人至少要得一个。有(  )种不同分法

      A33          B34       C35          D36

think:等同于10颗糖摆在桌上,在其中划两条线分成三份,划线的位置有9个,所以是从九个位置中选两个:9×8/2=36(之所以除以2是为了去掉重复的)

正确答案 :D         您的答案 :D

 

6.设一棵二叉树中有3个叶子节点,有8个度为1的节点,则该二叉树中总的节点数为?

A12         B13         C14         D15

think:

二叉树结点的度数指该结点所含子树的个数,二叉树是每个结点最多有两个子树的有序树(即度最多等于2)。

           关于度的计算,有这样一个公式:N2=N0-1,度为2的节点个数是度为0的节点个数减一。

           故在本题中,叶子节点不包含子树,说明在这棵二叉树中度为0的节点有三个。那么根据公式可以推出度为2的节点数N2=3-1=2。得Nsum = N2+N1+N0 = 2+3+8=13

正确答案 :B      您的答案 :A

 

7.某二叉树的先序遍历是12453,中序遍历是42513,那么其后续遍历是?

   A45231         B42351        C12345       D54321

think:

种主要的遍历思想为:

前序遍历:根结点 ---> 左子树 ---> 右子树

中序遍历:左子树---> 根结点 ---> 右子树

后序遍历:左子树 ---> 右子树 ---> 根结点

层次遍历:只需按层次遍历即可

例如,求下面二叉树的各种遍历

前序遍历:1  2  4  5  7  8  3  6 

中序遍历:4  2  7  5  8  1  3  6

后序遍历:4  7  8  5  2  6  3  1

层次遍历:1  2  3  4  5  6  7  8

 

正确答案 :A         您的答案 :A

 

8.有一台带一个千兆网卡的服务器A,会把接收到的消息转发给另外两台带一个千兆网卡的服务器B和C,B和C上面的一个服务进程处理一条10K字节的消息需要2毫秒。如果在B和C上面各跑80个服务进程,在不考虑CPU负载和进程切换、内存占用、传输损耗和交互损耗的情况下,B和C服务器每秒一共大约可以处理______条10K字节的消息。

        A12500         B60000         C70000         D80000

think:千兆网卡的单位是bit,也就是每秒只能发125000KB,最多处理12500条

千兆网卡每秒最多处理数据是1000/8=125Mb=125000kb=12500个10k

正确答案 :A      您的答案 :B

 

9.将一个从大到小的数组,用以下排序方法排序成从小到大的,()最快。

     A插入排序            B冒泡排序           C快速排序         D堆排序

think:

冒泡排序经过优化以后,最好时间复杂度可以达到O(n)。设置一个标志位,如果有一趟比较中没有发生任何交换,可提前结束,因此在正序情况下,时间复杂度为O(n)。

选择排序在最坏和最好情况下,都必须在剩余的序列中选择最小(大)的数,与已排好序的序列后一个位置元素做交换,依次最好和最坏时间复杂度均为O(n^2)。

插入排序是在把已排好序的序列的后一个元素插入到前面已排好序(需要选择合适的位置)的序列中,在正序情况下时间复杂度为O(n)。

堆是完全二叉树,因此树的深度一定是log(n)+1,最好和最坏时间复杂度均为O(n*log(n))。

归并排序是将大数组分为两个小数组,依次递归,相当于二叉树,深度为log(n)+1,因此最好和最坏时间复杂度都是O(n*log(n))。

快速排序在正序或逆序情况下,每次划分只得到比上一次划分少一个记录的子序列,用递归树画出来,是一棵斜树,此时需要n-1次递归,且第i次划分要经过n-i次关键字比较才能找到第i个记录,因此时间复杂度是\sum_{i=1}^{n-1}(n-i)=n(n-1)/2,即O(n^2)。
 ———————————————— 
版权声明:本文为CSDN博主「chengonghao」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chengonghao/article/details/51862666 

正确答案 :D       您的答案 :C

 

10.在一个元素个数为N的数组里,找到升序排在N/5位置的元素的最优算法时间复杂度是

     AO(n)         BO(n log n)             CO(n (log n)2)           DO(n 3/2)

think:

BFPRT算法解决的问题十分经典,即从某n个元素的序列中选出第k大(第k小)的元素,通过巧妙的分 析,BFPRT可以保证在最坏情况下仍为线性时间复杂度。该算法的思想与快速排序思想相似,当然,为使得算法在最坏情况下,依然能达到o(n)的时间复杂 度,五位算法作者做了精妙的处理。

算法步骤:

1. 将n个元素每5个一组,分成n/5(上界)组。

2. 取出每一组的中位数,任意排序方法,比如插入排序。

3. 递归的调用selection算法查找上一步中所有中位数的中位数,设为x,偶数个中位数的情况下设定为选取中间小的一个。

4. 用x来分割数组,设小于等于x的个数为k,大于x的个数即为n-k。

5. 若i==k,返回x;若i<k,在小于x的元素中递归查找第i小的元素;若i>k,在大于x的元素中递归查找第i-k小的元素。

终止条件:n=1时,返回的即是i小元素。


 ———————————————— 
版权声明:本文为CSDN博主「chengonghao」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chengonghao/article/details/51862180

正确答案 :A          您的答案 :B

 

11.以下措施中,不可能改进分布式系统读写(IO)性能的有____。

A网络从千兆网升级为万兆网

B优化调度系统,尽量做到任务与数据相近(Locality)

C数据预取机制

D实现异步读写机制

think:

同步阻塞I/O: 这是最常用的模型,用户间的应用程序执行一个系统的调用,会导致应用程序阻塞。程序会一直阻塞,直到调用完成为止。调用应用程序处于一种不再消费CPU而只是简单等待响应状态,从处理来看这是非常有效的。 异步阻塞: 在这种模型中,配置的是非阻塞 I/O,然后使用阻塞 select 系统调用来确定一个 I/O 描述符何时有操作。使 select 调用非常有趣的是它可以用来为多个描述符提供通知,而不仅仅为一个描述符提供通知。对于每个提示符来说,我们可以请求这个描述符可以写数据、有读数据可用以及是否发生错误的通知。select 调用的主要问题是它的效率不是非常高。尽管这是异步通知使用的一种方便模型,但是对于高性能的 I/O 操作来说不建议使用

io进行的是读写操作,而影响读写操作的因素主要是数据。ABC都在对数据压力进行减轻,而D实际上并没有减轻对数据的处理。
 ———————————————— 
版权声明:本文为CSDN博主「chengonghao」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chengonghao/article/details/51862102

正确答案 :D         您的答案 :A

 

12.主机甲和主机乙间已建立一个TCP连接,主机甲向主机乙发送了两个连续的TCP段,分别包含300字节和500字节的有效载荷,第一个段的序列号为200,主机乙正确接收到两个段后,发送给主机甲的确认序列号是?

    A500         B700        C800        D1000

think:确认序列号=原始序列号+TCP段的长度,所以第一次的确认序列号为200+300=500,第二次确认序列号为500+500=1000,选D。

正确答案 :D      您的答案 :B

 

13.无锁化编程有哪些常见方法?

A针对计数器,可以使用原子加

B只有一个生产者和一个消费者,那么就可以做到免锁访问环形缓冲区(Ring Buffer)

CRCU(Read-Copy-Update),新旧副本切换机制,对于旧副本可以采用延迟释放的做法

DCAS(Compare-and-Swap),如无锁栈,无锁队列等待

think:链接:https://www.nowcoder.com/questionTerminal/e77e066cb4b7496986fdea9c6d82a46a?orderByHotValue=1&pos=10&mutiTagIds=134
来源:牛客网
 

A 原子操作是汇编级别支持的指令lock xadd,如c++中的interlockIncrement,java中有AutomicInteger都是对其的封装。简单变量的线程同步用这种方式效率最高。

B 多个生产者和多个消费者,一样可以做到免锁访问,但要使用原子操作。这里的意思应该是不用原子操作级别的免锁,理由也很简单,生产者和消费者需要修改的位置是分开的(生产者加在尾部,消费者从头部消费),且只有一个读一个写,不会发生冲突。所以只有一点需要关注,就是尾部指针和头部指针每次需要比较以避免生产溢出或者过度消费,而简单变量的读操作都是原子的。

C 类似的一个概念叫CopyOnWrite,复制一份,修改完后,替换回去时只需替换一个指针或引用,锁住的粒度非常小。但有可能还有线程持有的是旧的指针,因此旧的副本需要延迟释放。

D 汇编级别支持的指令cmpxchg,锁定内存地址,比较地址中修改前的内容是否与修改时的值一致,如果不一致就说明有其他线程改动,需要重新做。如,内存地址0x123456中原来存放的是10101010,但CPU执行到cmpxchg指令时,发现内存中变成了11111111,那么就认为其他线程已经修改了这个地址的值,需要重新读取0x123456中的值11111111,再做一次cmpxchg,如果这次发现内存中仍然是11111111,那么cmpxchg就会把新的值写入到0x123456中去。这里面有个ABA问题,就是有线程改了2次从11111111 -> 10111111 -> 11111111,那么CAS操作是识别不了的,需要从业务层去避免,如果直接在0x123456再放一个地址值,而地址值如果不先释放再重新申请内存,就不会出现重复值。

正确答案 :D       您的答案 :D

 

14.小数值1.5625的二进制表示是?

A101.1001       B0.001          C101.111          D1.1001

think:链接:https://www.nowcoder.com/questionTerminal/c09728b5bc724e69be17b4d82e04e4b9?orderByHotValue=1&pos=155&mutiTagIds=609
来源:牛客网

小数点左侧:1 二进制还是1
右侧为.5625
采用乘2取整法
.5625*2 = 1.125....................1
.125*2 = 0.25 .....................0
.25*2 = 0.5........................0
.5*2 =  1.0........................1
所以 答案为1.1001
答案为:D

正确答案 :D         您的答案 :C

 

15.设集合A={1,2,3},A上的关系R={(1,1), (2,2), (2,3), (3,2), (3,3)},则R不具备 (  )?

     A自反性         B传递性       C对称性         D反对称性

think:链接:https://www.nowcoder.com/questionTerminal/d1866e29734d4494844aed3570fd2662
来源:牛客网
 

假设集合A,以及基于A上的关系R

自反: 如果a是A的元素,那么<a,a>是R的元素
反自反: 如果a是A的元素,那么<a,a>不是R的元素
对称:如果<a,b>是R的元素,那么<b,a>是R的元素
反对称:如果<a,b>,<b,a>是R的元素,那么a,b相等
传递:如果<a,b>,<b,c>是R的元素,那么<a,c>是R的元素

正确答案 :D         您的答案 :C

 

16.在N个乱序数字中查找第k大的数字,时间复杂度可以减小至

AO(N*logN)        BO(N)    CO(1)          DO(2)

think:参考第十题

正确答案 :B      您的答案 :B

 

17.

struct T {
    char a;
    int *d;
    int b;
    int c:16;
    double e;
};
T *p;

在64位系统以及64位编译器下,以下描述正确的是

Asizeof(p) == 24       Bsizeof(*p) == 24        Csizeof(p->a) == 1         Dsizeof(p->e) == 4

think:

链接:https://www.nowcoder.com/questionTerminal/8e8b73ee8f3a402ba47876f8e0b2b62d
来源:牛客网

字节对齐的三个准则:

1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;

2) 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;

3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。

再来看这道题:

a占一个字节(注:地址为[0]),d作为64位指针占8个字节(注1:32位占四个字节,p也一样)(注2:根据上面的准则2,d的偏移量要为8的整数倍,所以d的地址为[8]-[15],而非[1]-[8],下同),b占了4个字节(注:地址为[16][19]),c指定为16为,占了两个字节(注:地址为[20,21]),e占8个字节,(同d的分析一样,e的地址应该为[24][31]),所以A的答案应该是8,B的答案是32,C正确,D的答案为8。

正确答案 :C       您的答案 :B

 

18.IP数据报头采用()字节序,在此字节序下从低地址到高地址0x1234的表示形式为 () 

Abig_endian,0x12 0x34 0 0

Blittle_endian,0x34 0x12 0 0

Cbig_endian,0 0 0x12 0x34

Dlittle_endian, 0 0 0x34 0x12

https://www.nowcoder.com/questionTerminal/62b065a81df34ddebdf509cc748a785d

正确答案 :C     您的答案 :C

 

19.有两个N*N的矩阵A和B,想要在PC上按矩阵乘法基本算法编程实现计算A*B。假设N较大,本机内存也很大,可以存下A、B和结果矩阵。那么,为了计算速度,A和B在内存中应该如何存储(按行存指先存储第一行,再第二行,直到最后一行;按列存指先存储第一列,再第二列,直到最后一列)?

AA按行存,B按行存。

BA按行存,B按列存。

CA按列存,B按行存。

DA按列存,B按列存。

正确答案 :B         您的答案 :C

 

20.在二进制数据中,小数点向右移一位,则数据

A除以10        B除以2        C乘以2      D乘以10

右移表示数据增加,所以乘以2 C

正确答案 :C    您的答案 :B

 

21.设栈S初始状态为空。元素a,b,c,d,e,f依次通过栈S,若出栈的顺序为c,f,e,d,b,a,则栈S的容量至少应该为?

A3        B4       C5        D6

think:

栈内情况:

A

AB

ABC -->C 出栈

ABD

ABDE

ABDEF -->F出栈

ABDE -->E出栈

ABD -->D出栈

AB -->B出栈

最多为5个

正确答案 :C     您的答案 :C

 

22.以下指令集架构属于复杂指令集架构的是?

AARM       BMIPS        CSPARC        D以上皆不是

think:都属于精简指令集

正确答案 :D         您的答案 :A

 

23.下列叙述中正确的是?

A循环队列有队头和队尾两个指针,因此,循环队列是非线性结构

B在循环队列中,只需要队头指针就能反映队列中元素的动态变化情况

C在循环队列中,只需要队尾指针就能反映队列中元素的动态变化情况

D循环队列中元素的个数是有队头指针和队尾指针共同决定

think:循环队列有队头和队尾两个指针,但是循环队列仍是线性结构的,所以A错误;在循环队列中只需要队头指针与队尾两个指针来共同反映队列中元素的动态变化情况,所以B与C错误

正确答案 :D     您的答案 :D

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值