阿里巴巴实习生笔试题(含答案).docx

上传人:豆**** 文档编号:28488688 上传时间:2022-07-28 格式:DOCX 页数:42 大小:1.53MB
返回 下载 相关 举报
阿里巴巴实习生笔试题(含答案).docx_第1页
第1页 / 共42页
阿里巴巴实习生笔试题(含答案).docx_第2页
第2页 / 共42页
点击查看更多>>
资源描述

《阿里巴巴实习生笔试题(含答案).docx》由会员分享,可在线阅读,更多相关《阿里巴巴实习生笔试题(含答案).docx(42页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-date阿里巴巴2017实习生笔试题(含答案)阿里巴巴2017实习生笔试题(含答案)答案:D内联函数:Tip: 只有当函数只有 10 行甚至更少时才将其定义为内联函数.定义: 当函数被声明为内联函数之后, 编译器会将其内联展开, 而不是按通常的函数调用机制进行调用.优点: 当函数体比较小的时候, 内联该函数可以令目标代码更加高效. 对于存取函数以及其它函数体比较短, 性能关键

2、的函数, 鼓励使用内联.缺点: 滥用内联将导致程序变慢. 内联可能使目标代码量或增或减, 这取决于内联函数的大小. 内联非常短小的存取函数通常会减少代码大小, 但内联一个相当大的函数将戏剧性的增加代码大小. 现代处理器由于更好的利用了指令缓存, 小巧的代码往往执行更快。结论: 一个较为合理的经验准则是, 不要内联超过 10 行的函数. 谨慎对待析构函数, 析构函数往往比其表面看起来要更长, 因为有隐含的成员和基类析构函数被调用!另一个实用的经验准则: 内联那些包含循环或 switch 语句的函数常常是得不偿失 (除非在大多数情况下, 这些循环或 switch 语句从不被执行).注意:有些函数即

3、使声明为内联的也不一定会被编译器内联, 这点很重要; 比如虚函数和递归函数就不会被正常内联. 通常, 递归函数不应该声明成内联函数.(递归调用堆栈的展开并不像循环那么简单, 比如递归层数在编译时可能是未知的, 大多数编译器都不支持内联递归函数). 虚函数内联的主要原因则是想把它的函数体放在类定义内, 为了图个方便, 抑或是当作文档描述其行为, 比如精短的存取函数.-inl.h文件:Tip: 复杂的内联函数的定义, 应放在后缀名为 -inl.h 的头文件中.内联函数的定义必须放在头文件中, 编译器才能在调用点内联展开定义. 然而, 实现代码理论上应该放在 .cc 文件中, 我们不希望 .h 文件

4、中有太多实现代码, 除非在可读性和性能上有明显优势.如果内联函数的定义比较短小, 逻辑比较简单, 实现代码放在 .h 文件里没有任何问题. 比如, 存取函数的实现理所当然都应该放在类定义内. 出于编写者和调用者的方便, 较复杂的内联函数也可以放到 .h 文件中, 如果你觉得这样会使头文件显得笨重, 也可以把它萃取到单独的 -inl.h 中. 这样把实现和类定义分离开来, 当需要时包含对应的 -inl.h 即可。A项错误,因为使用inline关键字的函数只是用户希望它成为内联函数,但编译器有权忽略这个请求,比如:若此函数体太大,则不会把它作为内联函数展开的。B项错误,头文件中不仅要包含inlin

5、e函数的声明,而且必须包含定义,且在定义时必须加上inline。【关键字inline必须与函数定义体放在一起才能使函数成为内联,仅将inline放在函数声明前面不起任何作用】C项错误,inline函数可以定义在源文件中,但多个源文件中的同名inline函数的实现必须相同。一般把inline函数的定义放在头文件中更加合适。D项正确,类内的成员函数,默认都是inline的。【定义在类声明之中的成员函数将自动地成为内联函数】EF项无意思,不管是class声明中定义的inline函数,还是class实现中定义的inline函数,不存在优先不优先的问题,因为class的成员函数都是inline的,加了关

6、键字inline也没什么特殊的答案:D 插入排序改良的冒泡最优也是n答案:A答案:A答案:B答案:D先序遍历中左右中序遍历左中右后序遍历左右中答案:DTCP建立连接时首先客户端和服务器处于close状态。然后客户端发送SYN同步位,此时客户端处于SYN-SEND状态,服务器处于lISTEN状态,当服务器收到SYN以后,向客户端发送同步位SYN和确认码ACK,然后服务器变为SYN-RCVD,客户端收到服务器发来的SYN和ACK后,客户端的状态变成ESTABLISHED(已建立连接),客户端再向服务器发送ACK确认码,服务器接收到以后也变成ESTABLISHED然后服务器客户端开始数据传输答案:F

7、假设为n进值则 2*(n2)+4*(n1)+0 * 1*n+2=2*(n3)+8*(n2)+8*(n1)化简后居然为很等式 ,n为任意值答案:B用户空间与系统空间所在的内存区间不一样,同样,对于这两种区间,CPU的运行状态也不一样。在用户空间中,CPU处于用户态;在系统空间中,CPU处于系统态。答案:Cselectselect能监控的描述符个数由内核中的FD_SETSIZE限制,仅为1024,这也是select最大的缺点,因为现在的服务器并发量远远不止1024。即使能重新编译内核改变FD_SETSIZE的值,但这并不能提高select的性能。每次调用select都会线性扫描所有描述符的状态,在

8、select结束后,用户也要线性扫描fd_set数组才知道哪些描述符准备就绪,等于说每次调用复杂度都是O(n)的,在并发量大的情况下,每次扫描都是相当耗时的,很有可能有未处理的连接等待超时。每次调用select都要在用户空间和内核空间里进行内存复制fd描述符等信息。pollpoll使用pollfd结构来存储fd,突破了select中描述符数目的限制。与select的后两点类似,poll仍然需要将pollfd数组拷贝到内核空间,之后依次扫描fd的状态,整体复杂度依然是O(n)的,在并发量大的情况下服务器性能会快速下降。epollepoll维护的描述符数目不受到限制,而且性能不会随着描述符数目的增

9、加而下降。服务器的特点是经常维护着大量连接,但其中某一时刻读写的操作符数量却不多。epoll先通过epoll_ctl注册一个描述符到内核中,并一直维护着而不像poll每次操作都将所有要监控的描述符传递给内核;在描述符读写就绪时,通过回掉函数将自己加入就绪队列中,之后epoll_wait返回该就绪队列。也就是说,epoll基本不做无用的操作,时间复杂度仅与活跃的客户端数有关,而不会随着描述符数目的增加而下降。epoll在传递内核与用户空间的消息时使用了内存共享,而不是内存拷贝,这也使得epoll的效率比poll和select更高。答案:F答案:4答案:165/在100-999这900个自然数中,

10、若将组成这个数的三个数字认为是三条线段的长度,那么是三条线段组成一个等腰三角形(包括等边)的共有()个.#include using namespace std;int main()int a = 0;int b = 0;int c = 0;int time = 0;for (int i = 100; i c) | (b = c & (c + ba) | (c = a & (a + cb)time+;cout time endl;return 0;答案:关联数组1.循环链表是另一种形式的链式存贮结构。特点是表中最后一个结点的指针域指向头结点,整个链表形成环。 (1) 单循环链表在单链表中,将终

11、端结点的指针域NULL改为指向表头结点或开始结点即可。(2)多重链的循环链表将表中结点链在多个环上。2队列(Queue)是只允许在一端进行插入,而在另一端进行删除的运算受限的线性表;3.栈(stack)在计算机科学中是限定仅在栈顶进行插入或删除操作的线性表。4. “关联数组”是一种具有特殊索引方式的数组。不仅可以通过整数来索引它,还可以使用字符串或者其他类型的值(除了NULL)来索引它。关联数组和数组类似,由以名称作为键的字段和方法组成。它包含标量数据,可用索引值来单独选择这些数据,和数组不同的是, 关联数组的索引值不是非负的整数而是任意的标量。这些标量称为Keys,可以在以后用于检索数组中的

12、数值。关联数组的元素没有特定的顺序,你可以把它们想象为一组卡片。每张卡片上半部分是索引而下半部分是数值。5.链表(Linked list)是一种常见的基础数据结构,是一种线性表,是一种物理存储单元上非连续、非顺序的存储结构。双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。答案:B桶排序的平均时间复杂度为线性的O(N+C),其中C=N*(logN-logM)。如果相对于同样的N,桶数量M越大,其效率越高,最好的时间复杂度达到O(N)。 当然桶排

13、序的空间复杂度 为O(N+M),如果输入数据非常庞大,而桶的数量也非常多,则空间代价无疑是昂贵的。此外,桶排序是稳定的。答案:B答案:F选项AB是对称的,所以肯定正确,由AB可以看出题目的意图是,这次交换靠的是物品的相对价值相当(小张觉得橡皮比小刀更好,小王觉得小刀比橡皮更好),但明显最后一个选项等值指的是他们的绝对价值答案:161.struct的对齐原则,注意不同的编译器有不同的效果。2.不同的数据类型在32位和64位下所占字节的区别32位编译器: char :1个字节char*(即指针变量): 4个字节(32位的寻址空间是232, 即32个bit,也就是4个字节。同理64位编译器) sho

14、rt int : 2个字节 int:4个字节 unsigned int : 4个字节 float:4个字节 double:8个字节 long:4个字节 long long:8个字节 unsigned long:4个字节 64位编译器: char :1个字节char*(即指针变量): 8个字节 short int : 2个字节int:4个字节 unsigned int : 4个字节 float:4个字节 double:8个字节long:8个字节 long long:8个字节unsigned long:8个字节此处指针先占用8字节。int占用4字节,满足要求不用补齐,char占用一个字节,同时总的

15、字节数必须满足8的倍数即16答案:100 300 300 500vector:erase():从指定容器删除指定位置的元素或某段范围内的元素vector:erase()方法有两种重载形式如下:iterator erase( iterator _Where);iterator erase( iterator _First, iterator _Last);如果是删除指定位置的元素时:返回值是一个迭代器,指向删除元素下一个元素;如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素;本题中,当*itor=300成立时,删除第一个值为300的元素,同时itor指向下一个

16、元素(即是第二个值为300的元素)在for(;itor+)执行itor,itor指向第三个值为300的元素,进入下一个循环进入循环满足*itor=300,重复上面的过程,执行完循环,itor执行值为500的元素。所有整个过程中,只删除了2个值为300的元素。答案:C 可以修改类的静态成员属于整个类 而不是某个对象,可以被类的所有方法访问,子类当然可以父类静态成员;静态方法属于整个类,在对象创建之前就已经分配空间,类的非静态成员要在对象创建后才有内存,所有静态方法只能访问静态成员,不能访问非静态成员;静态成员可以被任一对象修改,修改后的值可以被所有对象共享答案:DKMP算法:时间复杂度O(p+N)答案:8每套校服都包括短袖运动衫,长袖运动衫,厚外套,运动长裤和运动短裤组成.“每种运动服”有个备选方案。说明校服一共有25=32种选择方案。任意3个学生都至少在一种运动服上选择互不相同,假设有老师邀请了n个学生参加挑选,说明Cn232Cn3,得出n=8。答案:C看第二次抽样即可,与第一次抽的是同一张牌的概率是1/4,不同张的概率是3/4,同一张的话肯定是一样,不同张的时候如果抽中一样的牌的概率是3/15,所以答案是1/4+3/4 * 3/15 = 2/5-

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 成人自考

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁