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)
将两个或两个以上的有序表组合到一起成为新的有序表。
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,请尽量考虑性能与资源的占用。
未完待续……
公共题
选择题(每题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,请尽量考虑性能与资源的占用。
未完待续……
相关文章推荐
- 2011阿里巴巴实习生笔试题目
- 阿里巴巴2011数据分析师实习生笔试题
- 金山-西山居2011实习生招聘笔试题目
- 阿里巴巴2013.5.5 实习生招聘笔试题目及解答
- 2011百度实习生笔试题目
- 阿里题目总结:——阿里巴巴2015实习生笔试真题
- 2011淘宝实习生笔试题目
- 2014阿里巴巴实习生笔试题目 .
- 阿里巴巴实习生笔试题目
- 2011腾讯实习生笔试题目
- 【IT企业笔试集】2013年阿里巴巴实习生招聘笔试题目及解答
- 2014阿里巴巴实习生笔试题目(答案 )
- 阿里巴巴2014年实习生笔试题目
- 2014年3月29阿里巴巴实习生笔试题目
- 2013年阿里巴巴实习生招聘笔试题目及解答
- 2013阿里巴巴暑期实习生笔试题目
- 金山-西山居2011实习生招聘笔试题目
- 2013年阿里巴巴实习生招聘笔试题目及解答
- 2013年阿里巴巴实习生招聘笔试题目及解答
- 2014年3月29阿里巴巴实习生笔试题目