【java阿里巴巴】 阿里巴巴2017实习生笔试题

都是什么鬼的题呀

关于c++的inline关键字,以下说法正确的是()
正确答案: D   你的答案: 空 (错误)
使用inline关键字的函数会被编译器在调用处展开
头文件中可以包含inline函数的声明
可以在同一个项目的不同源文件内定义函数名相同但实现不同的inline函数
定义在Class声明内的成员函数默认是inline函数
优先使用Class声明内定义的inline函数
优先使用Class实现的内inline函数的实现

A 项错误,因为使用 inline 关键字的函数只是用户希望它成为内联函数,但编译器有权忽略这个请求,比如:若此函数体太大,则不会把它作为内联函数展开的
B 项错误,
头文件中不仅要包含 inline 函数的声明,而且必须包含定义,且在定义时必须加上 inline 。【关键字 inline 必须与函数定义体放在一起才能使函数成为内联,仅将 inline 放在函数声明前面不起任何作用】
C 项错误,
inline 函数可以定义在源文件中,但多个源文件中的同名 inline 函数的实现必须相同。一般把 inline 函数的定义放在头文件中更加合适。
D 项正确,类内的成员函数,默认都是 inline 的。【定义在类声明之中的成员函数将自动地成为内联函数】

EF 项无意思,不管是 class 声明中定义的 inline 函数,还是 class 实现中定义的 inline 函数,不存在优先不优先的问题,因为 class 的成员函数都是 inline 的,加了关键字 inline 也没什么特殊的

对N个数进行排序,在各自最优条件下以下算法复杂度最低的是()
正确答案: D   你的答案: A (错误)
快速排序
堆排序
冒泡排序
插入排序
选择排序

归并排序


甲乙两个一样大小的杯子各自分别装着小于一半容积的水和酒精.现将甲杯子里的一部分水倒入乙杯子;之后将乙杯子的混合液倒入一些到甲杯子,此时甲杯子的液体恢复到最初的状态.假定水和酒精混合之后的体积等于混合之前的体积之和。 那么以下说法正确的是()
正确答案: A   你的答案: 空 (错误)
甲杯子里的酒精体积等于乙杯子里的水的体积
甲杯子里的酒精的体积等于乙杯子里的酒精的体积
甲杯子里的水的体积等于乙杯子里的酒精的体积
甲杯子里的水的体积等于乙杯子里的水的体积
甲杯子里的液体高于乙杯子里的液位

以上都不对

最初,甲杯子只有酒精,乙杯子只有水。
最后,甲杯子恢复到最初的高度,只是混入了一些酒精。
所以从乙杯子拿出多少酒精给甲杯子,乙杯子就有多少甲杯子的水。

ps:题目已经假设 酒精和水混合后等于两者容量之和

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

服务器接受到客户端的ack包后将从半连接队列删除

TCP建立连接时,首先客户端和服务器处于close状态。然后客户端发送SYN同步位,此时客户端处于SYN-SEND状态,服务器处于lISTEN状态,当服务器收到SYN以后,向客户端发送同步位SYN和确认码ACK,然后服务器变为SYN-RCVD,客户端收到服务器发来的SYN和ACK后,客户端的状态变成ESTABLISHED(已建立连接),客户端再向服务器发送ACK确认码,服务器接收到以后也变成ESTABLISHED。然后服务器客户端开始数据传输

http://www.cnblogs.com/tonyluis/p/5729531.html

假设在n进制下,下面的等式成立,n值是()240*12=2880
正确答案: F   你的答案: 空 (错误)
19
18
17
16
15

以上都对

假设为n进值则 [2*(n^2)+4*(n^1)+0] * [1*n+2]=2*(n^3)+8*(n^2)+8*(n^1) 

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

系统调用通过中断完成,这一过程中系统由用户态变为内核态。 在内核态下,系统可以无限制的访问内核资源

关于linux的I/O复用接口select和epoll,下列说法错误的是()
正确答案: C   你的答案: 空 (错误)
select调用时会进行线性遍历,epoll采用回调函数机制,不需要线性遍历
select的最大连接数为FD_SETSIZE
select较适合于有大量并发连接,且活跃链接较多的场景
epoll较适用于有大量并发连接,但活跃连接不多的场景
epoll的效率不随FD数目增加而线性下降

epoll通过共享存储实现内核和用户的数据交互

select 和 epoll效率差异的原因:select采用轮询方式处理连接,epoll是触发式处理连接。
Select:
1.Socket数量限制:该限制可操作的Socket数由FD_SETSIZE决定,内核默认32*32=1024.
2.操作限制:通过遍历FD_SETSIZE(1024)个Socket来完成调度,不管哪个Socket是活跃的,都遍历一遍。
Epoll
1.Socket数量无限制:该模式下的Socket对应的fd列表由一个数组来保存,大小不限制(默认4k)。
2.操作无限制:基于内核提供的反射模式,有活跃Socket时,内核访问该Socket的callback,不需要遍历轮询。
但当所有的Socket都活跃的时候,所有的callback都被唤醒,会导致资源的竞争。既然都是要处理所有的Socket,

那么遍历是最简单最有效的实现方式。

有无限的水源,一个5L无刻度桶和一个7L无刻度桶,则只利用这两个无刻度桶,将不能获得()L水
正确答案: F   你的答案: B (错误)
2
3
6
8
11

以上均能获得

5a+7b=t

7的2014次方这个整数的十位数字数是()
正确答案: D   你的答案: F (错误)
0
1
3
4
5

7

7^0=01
7^1=07
7^2=49
7^3=x43
7^4=x01

从此进入以4为周期的循环,2014=4*503+2,所以末尾2位应该是49。

在100-999这900个自然数中,若将组成这个数的三个数字认为是三条线段的长度,那么是三条线段组成一个等腰三角形(包括等边)的共有()个.
正确答案: F   你的答案: 空 (错误)
45
91
121
142
156
165

首先,等边三角形有9个。
考虑非等边的等腰三角形。若双边为1,则第三边不存在。
若双边为2,则第三边只能是1或3。同理,可知1-9的等腰三角形的个数为(0+2+4+6+8*5)=52
三位数任选两个作为等腰三角形的两边,有3种取法,总计52*3+9=165

下面哪个不是线性表?
正确答案: D   你的答案: A (错误)
循环链表
队列

关联数组
空字符串数组

双向链表

线性表,一对一关系,除首节点和尾节点外,每个结点都有一个直接前驱和后继结点。
关联数组,是数组的一组,在物理存储层面来讲,数组是连续的等大的存储单元构成,每个单元存储的数据类型都是一样的。

但是关联数组的特性是key-value,根据key来查找value,这也就意味着关联数组的每个元素可以无前后顺序是离散的不是线性连续的

下面的哪种排序算法在算复杂度平均不是O(nlogn)的?
正确答案: B   你的答案: 空 (错误)
快速排序
桶排序
合并排序
二叉树排序树排序
堆排序

有100个金币,分给10个人.第一个金币等概率地分给10个人之一.之后的每一个金币分配给第K个人的概率正比于这个人已经持有的金币数+1.在这样的分配机制下,关于每个人最终的金币个数的分布的说法错误的是()
正确答案: B   你的答案: 空 (错误)
每个人得到的金币的个数的期望是相等的
每个人的金币个数接近均匀分布
第一个金币给哪个人,哪个人的最终金币个数的期望就会更大
在中间的某个阶段金币个数越多的人,未来获得金币的可能性越大

#include <iostream>       
#include <vector>
using namespace std;
int main(void)
{
    vector<int>array;
    array.push_back(100);
    array.push_back(300);
    array.push_back(300);
    array.push_back(300);
    array.push_back(300);
    array.push_back(500);
    vector<int>::iterator itor;
    for(itor=array.begin();itor!=array.end();itor++)
    {
        if(*itor==300)
        {
            itor=array.erase(itor);
        }
    }
    for(itor=array.begin();itor!=array.end();itor++)
    {
            cout<<*itor<<"";
    }
  return 0;
}
下面这个代码输出的是()

正确答案: C   你的答案: 空 (错误)
100 300 300 300  300 500
100 3OO 300 300 500
100 300 300 500
100 300 500
100 500

程序错误

smartz
vector::erase():从指定容器删除指定位置的元素或某段范围内的元素 
vector::erase()方法有两种重载形式 
如下: 
iterator erase(   iterator _Where); 
iterator erase(   iterator _First,   iterator _Last); 
如果是删除指定位置的元素时: 
返回值是一个迭代器,指向删除元素下一个元素; 
如果是删除某范围内的元素时:返回值也表示一个迭代器,指向最后一个删除元素的下一个元素;


在本题中,当 *itor==300成立时,删除第一个值为300的元素,同时itor指向下一个元素(即是第二个值为300的元素),
                            在for(;;itor++)执行itor,itor指向第三个值为300的元素,进入下一个循环
         进入循环满足*itor==300,重复上面的过程,执行完循环,itor执行值为500的元素。

所有整个过程中,只删除了2个值为300的元素。

给定的一个长度为N的字符串str,查找长度为P(P<N)的字符串在str中的出现次数.下面的说法正确的是()
正确答案: D   你的答案: 空 (错误)
不存在比最坏时间复杂度O(NP)好的算法
不存在比最坏时间复杂度O(N^2)好的算法
不存在比最坏时间复杂度O(P^2)好的算法
存在最坏时间复杂度为O(N+P)的算法
存在最坏时间复杂度为O(log(N+P))的算法

以上都不对

http://blog.csdn.net/liu940204/article/details/51318281

某体校选择校服,每套校服都包括短袖运动衫,长袖运动衫,厚外套,运动长裤和运动短裤组成.每种运动服有3个备选方案.老师请了部分学生来挑选自己喜欢的校服.结果发现任意3个学生都至少在一种运动服上选择互不相同,那么老师最多邀请了()名学生参加挑选.
正确答案: B   你的答案: 空 (错误)
7
8
9
10
11

12


有4副相同的牌,每副牌有4张不同的牌.先从这16张牌中,随机选4张出来.然后,在这4张牌中随机选择一张牌,然后把抽出的一张放回3张中,再随机选择一张牌.与上次选出的牌一样的概率是()
正确答案: C   你的答案: A (错误)
1/4
1/3
2/5
1/2
2/3

3/4

直接看第二次抽样即可,与第一次抽的是同一张牌的概率是1/4,不同张的概率是3/4,同一张的话肯定是一样,不同张的时候如果抽中一样的牌的概率是3/15,所以答案是1/4+3/4 * 3/15 = 2/5

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

减少页面交换

1 静态链接库的优点 

 (1) 代码装载速度快,执行速度略比动态链接库快; 

 (2) 只需保证在开发者的计算机中有正确的.LIB文件,在以二进制形式发布程序时不需考虑在用户的计算机上.LIB文件是否存在及版本问题,可避免DLL地狱等问题。 

2 动态链接库的优点 

 (1) 更加节省内存并减少页面交换;

 (2) DLL文件与EXE文件独立,只要输出接口不变(即名称、参数、返回值类型和调用约定不变),更换DLL文件不会对EXE文件造成任何影响,因而极大地提高了可维护性和可扩展性;

 (3) 不同编程语言编写的程序只要按照函数调用约定就可以调用同一个DLL函数;

 (4)适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试。

3 不足之处

 (1) 使用静态链接生成的可执行文件体积较大,包含相同的公共代码,造成浪费;

 (2) 使用动态链接库的应用程序不是自完备的,它依赖的DLL模块也要存在,如果使用载入时动态链接,程序启动时发现DLL不存在,系统将终止程序并给出错误信息。而使用运行时动态链接,系统不会终止,但由于DLL中的导出函数不可用,程序会加载失败;速度比静态链接慢。当某个模块更新后,如果新模块与旧的模块不兼容,那么那些需要该模块才能运行的软件,统统撕掉。这在早期Windows中很常见。

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

O(mn)

剑指offer第30题
1.最简单的方法:将n个数排序,排序后的前k个数就是最大的k个数,这种算法的复杂度是O(nlogn)
2.O(n)的方法:利用快排的patition思想,基于数组的第k个数来调整,将比第k个数小的都位于数组的左边,比第k个数大的都调整到数组的右边,这样调整后,位于数组右边的k个数最大的k个数(这k个数不一定是排好序的)

3.O(nlogk)的方法:先创建一个大小为k的最小堆,接下来我们每次从输入的n个整数中读入一个数,如果这个数比最小堆的堆顶元素还要大,那么替换这个最小堆的堆顶并调整。

由权值分别为1、12、13、4、8的叶子节点生成一颗哈夫曼树,它的带权路径长度为()
正确答案: F   你的答案: 空 (错误)
12
68
43
6
25

81

Hoffman树如下:
        38
 *13          25
          *12      13
                   5      *8
              *1     *4      
其中带*为原始元素,总共4层(不算根节点) 带权路径长度 13*1 + 12*2 + 8*3 + (1+4)*4 = 81
阿里巴巴国际站的股票代码是1688,这个数字具有这样的特性,首先是个首位为1的4位数,其次恰巧有且仅有1个数字出现了两次。类似的数字还有:1861,1668等。这样的数字一共有()个。
正确答案: F   你的答案: 空 (错误)
144
180
216
270
288
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
工程师M发明了一种游戏:M将一个小球随机放入完全相同的三个盒子中的某一个,玩家选中装有球的盒子即获胜;开始时M会让玩家选择一个盒子(选择任何一个获胜概率均为1/3);玩家做出选择后,M会打开没有被选择的两个盒子中的一个空盒,此时M会询问玩家是否更改选择(可以坚持第一次选择,也可以选择另一个没有打开的盒子),下列叙述正 确的有()。
正确答案: E   你的答案: C (错误)
改选后,玩家获胜的概率还是1/3
若不改选,玩家的获胜概率是1/2
无论怎么选择,获胜的概率都是1/2
坚持原来的选择获胜概率更高
选择另一个没有被打开的盒子获胜概率更高

获胜概率取决于随机因素(如小球的实际位置)

1. 不修改选择并获胜,表示第一次已经选对。概率为:1/3 * 1/2 = 1/6
2. 修改选择并 获胜,表示第一次选错。概率为:2/3 * 1/2 = 2/6

       综上可知,第二次选择中修改选择后获胜的概率较大。

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

以上访问方式都一样

I/O中断方式是以字节为单位,DMA控制方式是以一个连续的数据块为单位,I/O通道控制方式是DMA控制方式的发展,是以一组数据块为单位的,即可以连续读取多个数据块。

下列不是进程间的通信方式的是()
正确答案: B   你的答案: 空 (错误)
管道
回调
共享内存
消息队列
socket

信号量

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

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

大端从大地址开始存储,小端相反,两者都是从数据低位开始存起;

假设从上至下地址递增,则
PowerPC(大):                    Intel X86(小):
04                                            01                    低
03                                            02                      |
02                                            03                      |  
01                                            04                     高

a+3指向最大的地址,所以分别为1 4

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

服务器收到客户端的ack包后将从半连接队列删除

http://www.cnblogs.com/obama/p/3292335.html

问题描述:
#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   你的答案: A (错误)
20
21
22
23
24

非以上选项

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
    }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

同一个进程中的线程不共享的部分是()
正确答案: F   你的答案: F (正确)
信号

文件描述符
进程组id
代码段
栈空间

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值