测试卷链接:阿里巴巴2015算法工程师实习生笔试卷。
1、用十进制计算30!(30的阶乘),将结果转换成3进制进行表示的话,该进制下的结果末尾会有____个0。
分析:
计算N!下三进制结果末尾有多少个0,其实就是计算三进制中的3被移位了多少次,就像二进制一样,每乘以2就向左移一位,末尾补0,因此这道题只要将N!因式分解成3^m*other,m就是答案。
技巧性的解法就是m=N/3+N/(3^2)+N/(3^3)....+N(3^k) (k<=N/3),
用代码实现即为:
sum=0;
while(N){
sum+=N/3;
N=N/3;
}
return sum;
2、
小赵和小钱二人分别从寝室和图书馆同时出发,相向而行。过了一段时间后二人在中途相遇,小赵继续向图书馆前进,此时:若小钱继续向寝室前进,则当小赵到达图书馆时,小钱离寝室还有600米;若小钱立即折返向图书馆前进,则当小赵到达图书馆是,小钱离图书馆还有150米。那么图书馆与寝室间的距离是____。
- 1300m
- 1250m
- 800m
- 1050m
- 1100m
- 900m
分析:
3、某开发团队有6位开发同学,需参加5个项目
,
每个项目都有人做
,每位同学需要恰好参加1个项目,那么总共有____ 种不同的分配方案。
- 7200
- 3600
- 2700
- 1800
- 900
- 30
分析
:6个人,5个项目,每人只负责一个项目,则必有2人负责同一个项目;之后再全排序。
C(6,2)*A(5,5)。
4、下列选项中,识别模式与其他不一样的是____。
- 用户年龄分布判断:少年、青年、中年、老年
- 医生给病人诊断发病类型
- 投递员分拣信件
- 消费者类型判断:高消费、一般消息、低消费
- 出行方式判断:步行、骑车、坐车
- 商家对商品分级
分析:
可以理解为,E中的类型划分标准是客观的,不需要不是主观界定的;而其余选项中的界定标准是主观设置的,不同的主管对象设置标准可能会出现不同,所以它们和E中的划分标准不同。
5、如下SQL语句中,____可能返回null值。
(1) select count(*) from t1;
(2) select max(col1) from t1;
(3) select concat('max=',max(col1)) from t1;
- (1)可能,(2)和(3)不可能
- (2)可能,(1)和(3)不可能
- (3)可能,(1)和(2)不可能
- (1)不可能,(2)和(3)可能
- 都不可能
- 都可能
分析:答案选D, 原因如下:
(1). 若表t1中有记录,会返回记录数;若无记录,则返回0;
(2). 若表t1中存在列col为null, 则结果返回null;
(3). 若表t1中存在列col为null, 则结果返回null。
6、
以下关于STL的描述中,____是错的。
- STL容器是线程不安全的
- 当容量不够时,vector内部内存扩展方式是翻倍
- std::sort是稳定排序
- std::bitset不是一个STL容器
- std::stack默认是用deque实现的
- std::string中可以存储多个’\0’字符
分析:
选择:C
A:“很多程序员希望STL实现是完全线程安全的“。所以不安全。
B:vector的存在可以使开发者不必关心内存的申请和释放。但是,vector的一个缺点就是它的内存分配是按照2的倍数分配内存的。
C:错误。要知道 std::sort 不是稳定的排序算法,它不保证“相等”元素的相对位置,使用 std::stable_sort 来保证这一点
D:STL的容器可以分为以下几个大类:
一:序列容器, 有vector, list, deque, string.
二 : 关联容器, 有set, multiset, map, mulmap, hash_set, hash_map, hash_multiset, hash_multimap
三: 其他的杂项: stack, queue, valarray, bitset
E:正确。堆栈是一个线性表,插入删除操作都在一端进行,deque是先进先出的,操作原理和stack是一样的
7、
有8只球队,采用抽签的方式随机配对,组成4场比赛。假设其中有4只强队,那么出现强强对话 (任意两只强队相遇)的概率是____。
- 1/3
- 3/7
- 1/2
- 13/21
- 27/35
- 31/35
分析:四个强队不相遇的概率(8*6*4*2)/(8*7*6*5)=8/35,则相遇的概率就是27/35。
8、
两个市区C1和C2,其人口比率是1:3,从今年的患病统计来说,C1市区由于污染严重,患癌的概率是0.1%,而C2市的患癌概率是0.02%,现在医院接收到一位患癌病人,他是C1市区来的概率是____。
- 62.5%
- 25%
- 75%
- 77.5%
- 50%
- 70%
分析:
9、下面代码在64位Linux系统编译执行,输出结果是____
。
#include
#include
void print_size(int32_t array[10])
{
printf("%d\n", sizeof(array));
}
int main ()
{
int32_t myArray[10];
printf("%d ", sizeof(myArray));
print_size(myArray);
}
分析:
(1)、sizeof(数组名),返回的整个数组占据的字节数。在这里,数组长度为10,每个4字节,所以,总共40字节。
(2)、在64位操作系统中,地址为64位,也就是指针64位,占8字节。
(3)、通过函数调用后,数组名退化成指针,占8字节。
10、
假设某棵二叉查找树的所有键均为1到10的整数,现在我们要查找5。下面____不可能是键的检查序列。
- 10,9,8,7,6,5
- 2,8,6,3,7,4,5
- 1,2,9,3,8,7,4,6,5
- 2,3,10,4,8,5
- 4,9,8,7,5
- 以上均正确
分析:
二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根节点点的值;
(2)若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
(4)没有键值相等的节点。
先看A选项,第一个节点值为10,比要查找的5大,所以要接下来要比较10的左子树,左子树上的值一定比10小,而选项A中的第二个查找值是9,合理。此时,9仍然比待查找的数字5大,要继续查找9的左子树,左子树比9小,而查找的下一位数字为8,合理。依次类推。
答案选B。
11、以下程序在32位机器上运行输出是____。
#include
using namespace std;
class animal
{
protected:
int age;
public:
virtual void print_age(void) = 0;
};
class dog : public animal
{
public:
dog() {this -> age = 2;}
~dog() { }
virtual void print_age(void)
{
cout<<"Wang, my age = "< age< age = 1;}
~cat() { }
virtual void print_age(void)
{
cout<<"Miao, my age = "< age< print_age();
return 0;
}
- Wang, my age = 2
- Wang, my age = 1
- Miao, my age = 2
- Miao, my age = 1
- 程序编译报错
- 程序运行报错
分析:
B:带有虚函数的类中 首先产生VPTR 找到VTABLE
注意:原文认为(int*)(&b)是虚表的地址,我认为:(int *)*(int*)(&b)才是虚表地址
而(int*)*((int*)*(int*)(&b)); 才是虚表第一个虚函数的地址
且按照原文
p 是类cat的虚表指针
q 是类dog的虚表指针
p[0] 指向cat的第一个函数
q[0]指向dog的第一个函数
p[0] = q[0] 则p[0] 指向dog的第一个函数 则输出为wang age = 1
则结果为B。
12、
A,B,C三位同学都是很聪明的同学,面试官给他们背上依次贴上了数字2,4,8,他们都能看见别人的数字但无法看见自己的数字,现在面试官告诉他们这些数字都是自然数并且构成一个等比数列,让A、B、C同学依次循环回答是否确定自己的数字是多少,每位同学的回答算作一次,经过____次有同学能准确说出自己的数字。
分析:
1、第一次是A,此时他看到4和8,能判断出来等比是2,自己的数字可能是2或者16。回答不确定
2、第二次是B,此时他看到2和8,此时等比可能是2,那么自己的数字是4;或者等比是4,自己的数字是32。B知道A能看到8和自己的数字,如果自己的数字是4,那么A有两种可能,所以A回答不确定;如果自己的数字是32,那么A仍然有多种可能,所以A仍然可以回答不确定。所以B此时不能通过A的回答排除其中一种可能性。回答不确定
3、第三次是C,此时他能看到2和4,能判断等比是2,自己的数字可能是1或者8。C知道B能看到2和自己的数字,如果自己的数字是1,那么对B来说只能是4,是确定的。但B回答不确定,所以可以排除这种可能。因此C能确定自己的数字是8。
13、给定一个整数sum,从有N个无序元素的数组中寻找元素a、b、c、d,使得 a+b+c+d =sum,最快的平均时间复杂度是____。
- O(N^2)
- O(log N)
- O(N)
- O(N^3)
- O(N^2LogN)
- O(N^4)
分析:
O(N^3LogN)的算法:三重for循环穷举a,b,c的值,剩下d = sum-a-b-c,使用二分查找(数组事先排好序)来确定d是否存在。
O(N^2LogN)的算法:预先枚举c,d得到c+d的n^2个数字并排好序。双重for循环穷举a,b的值,再使用二分查找确定c+d是否存在。c+d的值得出来后同样枚举得出c,d的值。(或者在第一步就浪费一些空间将c+d对应的c,d存好,此时直接取出即可。)
排序及循环二分查找都为O(n^2logn)时间,总的O(n^2logn)时间。
14、
设二叉树结点的先根序列、中根序列和后根序列中,所有叶子结点的先后顺序____。
A、三者相同
B、只有先序和中序相同,与后序不同
C、只有中序和后序相同,与先序不同
D、只有先序和后序相同,与中序不同
E、视树的情况而定
F、三者都不相同
分析:
NLR先根序列,LNR中根序列,LRN后根序列,所有的叶节点都是从左到右的。
15、将整数序列(7-2-4-6-3-1-5)按所示顺序构建一棵二叉排序树a(亦称二叉搜索树),之后将整数8按照二叉排序树规则插入树a中,请问插入之后的树a中序遍历结果是____。
- 1-2-3-4-5-6-7-8
- 7-2-1-4-3-6-5-8
- 1-3-5-2-4-6-7-8
- 1-3-5-6-4-2-8-7
- 7-2-8-1-4-3-6-5
- 5-6-3-4-1-2-7-8
分析:
二查搜索树中序遍历一定是有序的:严格升序或者降序。
16、下列各项技术中,目的与程序的容错(fault-tolerance)最不相关的是____。
A、fail fast
B、graceful degradation
C、backup
D、sandbox
E、checkpoint
F、watchdo
分析:
(1).graceful degradation (优雅降级):优雅降级(Graceful degradation)是指电脑,机器,电子系统或者是网络在本身大部分已经毁坏或无效的情况下还能保持有限的功能这种能力。优雅降级的目的是阻止灾难性的失败。理想情况下,有优雅降级特征的系统即使多个组件同时失效也不会引起停机。在优雅降级中,操作的效率和速度随着失效部件的增加逐渐下降。
(2).sandbox(沙盒/沙箱)
用于为一些来源不可信、具备破坏力或无法判定程序意图的程序提供试验环境。然而,沙盒中的所有改动对操作系统不会造成任何损失。通常这种技术被计算机技术人员广泛使用,尤其是计算机反病毒行业,沙盒是一个观察计算机病毒的重要环境。 影子系统
即是利用了这种技术的软件之一。
有时沙盒也叫 沙箱
,英文 sandbox
。在计算机领域指一种 虚拟技术
,且多用于 计算机安全技术
。其原理是通过重定向技术,把程序生成和修改的文件定向到自身文件夹中。当某个程序试图发挥作用时,安全软件可以先让它在沙盒中运行,如果含有恶意行为,则禁止程序的进一步运行,而这不会对系统造成任何危害。
(3).watchdog:在由 单片机 构成的 微型计算机系统 中,由于单片机的工作常常会受到来自外界电磁场的干扰,造成程序的跑飞,而陷入死循环,程序的正常运行被打断,由单片机控制的系统无法继续工作,会造成整个系统的陷入停滞状态,发生不可预料的后果,所以出于对单片机运行状态进行实时监测的考虑,便产生了一种专门用于监测单片机程序运行状态的芯片,俗称" 看门狗 "。
看门狗是恢复系统的正常运行及有效的监视管理器。
17、对于192.168.0.0到192.168.0.255这个网络来说,以下说法中正确的是____。
- 网段内可用来作为主机IP的范围是:192.168.0.0到192.168.0.255
- Network IP是192.168.0.255
- Broadcast IP是192.168.0.0
- 网段内的主机可以通过网卡对网卡传递数据
- 192.168.0.1和192.168.0.2的主机需要使用Router传递数据包
- 是class B等级
分析:
A. 错: 分配IP地址时关于主机标识要注意。用比特位表示主机地址时,不可以全为0或全为1
全为0:表示对应的网络地址或IP地址不可获知的情况
全为1:表示主机地址通常作为广播地址
这也是C类地址每个网段只能有254(2^8-1)个主机的原因
B. 错: 广播地址是主机位全为1,C类地址主机位占用后面8为,故为192.168.0.255;
C. 错: 网络地址是主机位全为0,故为192.168.0.0。
D. 对
E. 该网段的主机之间可以直接传递数据包,不需要经过路由器
F. 错: 是class C 等级
18、
以下是一个有向图,我们从节点B开始进行深度优先遍历(DFS),那么以下5个序列中,所有正确的DFS序列是____。
1、BADECF 2、BADEFC 3、BCAFDE 4、BCFDEA 5、BFDECA
分析:深度优先遍历:优先探索完一条通路后才返回倒数第二个节点继续探索另一条通路。如此往复直到所有节点都遍历结束。
19、已知int a[]={1,2,3,4,5};int*p[]={a,a+1,a+2,a+3};int **q=p;表达式*(p[0]+1)+**(q+2)的值是____。
分析:
其中p[0]=a也就是a[0]的地址,
p[0]+1=a+1就是a[1]的地址,
*(p[0]+1)就是a[1]的值就是2,
**q=p --> *q=&p -->表示q保存的是p 的地址,q+2表示p[2]的地址,*(q+2)表示p[2],
**(q+2)表示*p[2]表示*(a+2)就是a[2]的值就是3,
所以,
*(p[0]+1)+**(q+2)=5。
20、设x、y、t均为int型变量,则执行语句:t=3; x=y=2; t=x++||++y; 后,变量t和y的值分别为____。
- t=1 y=2
- t=1 y=3
- t=2 y=2
- t=2 y=3
- t=3 y=2
- t=3 y=3
分析:x++||++y执行后的结果是真,即1,然后赋值给t。因为是或运算,所以在判断x++时真后,后面的++y就不再执行了,所以y值没有变还是2.选A。