您的位置:首页 > 其它

2011阿里巴巴实习生笔试题目

2014-03-29 11:34 211 查看
最近准备笔试感觉好麻烦,翻看了之前的笔试题目。自己也做了一下,下面是部分,有的自己也没做。

公共题
选择题(每题5分)
1. 若一棵二叉树具有10个度为2的结点,则该二叉树的度为0的结点个数是(B )

A:9 B:11 C:12 D:不确定

解析:节点拥有的子树数目--->度,n0=n2+1

2.下列排序算法中,其时间复杂度和记录的初始排列无关的是( B )

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

解析:堆排序和快速排序的时间复杂度都是o(nlogn),但是快速排序与初始排列

快速排序:o(n^2)

堆排序:O(nlgn)

快速排序:O(nlgn)

冒泡排序:o(n^2)

堆排序的时间复杂度是O(nlgn),也是最快的排序方法之一,在最坏的情况下,其时间复杂度还是O(nlgn),相对于快速排序来说,这是堆排序的最大优点



3.已知中序遍历的序列为abcdef,高度最小的可能的二叉树的叶子是( ABC )

A:ace B:acf C:adf D:cdf

解析:中序(根)遍历LDR,叶子即度为0的节点acf、adf、ace、acf

c d c d

b e b e b e b f

a d f a c f a d f a c e

4.参加百年阿里培训的n位同学结伴去西湖旁边为游人指路,两人一组,他们打算先让体重之和恰好为102公斤的同学一组,请给出一个算法找到这样的组合,或者确定他们中不存在这样的组合,其中最优的算法时间复杂度为?(假设体重均为整数)( B )

A:O(log(n)) B:O(n) C:O(n log(n)) D:O(n^2)

解析:B哈希:a+b=102,

b=102-a;对所有数字先建立一个哈希表增加了o(n)的hash存储空间,算法复杂度降低到了o(n)。详细可以参照《编程之美》2.12

5.众所周知数据结构中非常基本的树结构包括二叉查找树(BST)。当我们把如下序列:10,5,19,4,13,7,6,3,1按顺序建立一棵BST时,树的最大深度是?(令根节点深度为0,执行不进行平衡的基本插入) ( B )

A:5 B:4 C:3 D:2

解析:B

10

5 19

4 7 13

3 6

1

6.阿里巴巴启用了新的办公大厦,这里的一切都充满了现代感;工程师们打算在娱乐区用大小相等的圆形材料分割出一些空间,使用A,B,C三个圆形材料,最多可以将空间分为八个区域(包括圆形以外的区域),如果给你五个圆形材料,你最多可以帮助工程师们分出多少个空间? ( C )

A:20 B:22 C:26 D:32

解析:我自己只分出了22个,网上给的答案是26,待解答

综合题(每题15分)
1) 分析MergeSort的原理以及算法复杂度,并用最擅长的编程语言实现Merge Sort。

归并排序(MergeSort)

将两个或两个以上的有序表组合到一起成为新的有序表。

#include <iostream>
using namespace std;
void merge(int* a,int m,int n,int s)
{
//开辟一个空间存放返回值
int *re=(int*)malloc(sizeof(int)*n);
int temp=s++,k=m,low=m;
while(m<=temp&&s<=n)
{
if(a[m]<=a[s])re[k++]=a[m++];
else re[k++]=a[s++];
}
while(s<=n)re[k++]=a[s++];
while(m<=temp)re[k++]=a[m++];
for(k=low;k<=n;k++)a[k]=re[k];
}
int MergeSort(int* a,int m,int n)
{
if(a==NULL)
{
return 1;
}
int s;
if(m<n)
{
s=(n+m)/2;
MergeSort(a,m,s);
MergeSort(a,s+1,n);
merge(a,m,n,s);
}
}
int main()
{
int src[] = {49,38,65,97,76,13,27,49};

int i,j,cnt = sizeof(src)/4;

MergeSort(src,0,cnt-1);

//输出
for(i = 0; i < cnt; i ++) cout<<src[i]<<" ";
cout<<endl;

getchar();
return 0;
}


2) 给定一个数t, 以及n个整数,在这n个数中找到加和为t的所有组合, 例如t = 4,n = 6, 这6个数为 [4, 3, 2, 2, 1, 1], 这样输出就有4个不同的组合它们的加和为4: 4, 3+1, 2+2, and 2+1+1. 请设计一个高效算法实现这个需求。

解析:哈希:a+b=t,

b=t-a;对所有数字先建立一个哈希表增加了o(n)的hash存储空间,算法复杂度降低到了o(n)。详细可以参照《编程之美》2.12

热点题 聊聊近期最吸引你的互联网事件,谈谈你对此事件的看法。

解析:略,百度之。

C&C++部分
选择题(每题5分)
1、int main(void)

{

int count=0; int m=779;

while(m)

{count++; m=m&(m-1);}

printf("%d\n",count); return 0;

}

请问最终输出的count值为( C ) A: 3 B:4 C:5 D:8

解析:779二进制为1100001011,每次循环都会从低位消去一个1,总共五次循环

2、在32位操作系统中,我们定义如下变量

int (*n)[10];

请问调用函数sizeof(n),返回值为( A ) A:4 B:40 C:8 D:80

解析:int 32位所以为4

3、int main(void)

{

int i=1; int j=i++;

if((i++>++j)&& (++i == j)) i+=j;

printf("%d\n",i); return 0;

}

请问最终输出的i值为( B ) A: 2 B:3 C:4 D:5

解析:

int main(void)
{
int i=1; int j=i++; //j=1,i=2
if((i++>++j)&& (++i == j)) i+=j;//i=3,j=2,只执行了前半段&&之前的(i++>++j)&& (++i == j)
printf("%d\n",i); return 0;
}

4、以下叙述中正确的是(C )

A:可以在一个函数中定义另一个函数 B:main()函数必须放在其他函数之前

C:构成C++语言程序的基本单位是类 D:所有被调用的函数一定要在调用之前进行定义

解析:C++面向对象编程,基本单位就是类,ABD都错

综合题(每题15分)
有10亿个数,这些数的值都在0~1000万之内。请使用定义一个数据结构实现这些数字的存储,并实现函数get_bigger_count( unsigned value ),输入一个值value,返回这10亿个数中比value值大的数的数目。

要求:不能使用STL,请尽量考虑性能与资源的占用。

未完待续……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: