2011阿里巴巴集团实习生招聘笔试题 C&C++


 答案为自己整理的,欢迎批评指正。

公共题

选择题(每题5分)

1. 若一棵二叉树具有10个度为2的结点,则该二叉树的度为0的结点个数是(      )

A:9    B11     C:12     D:不确定 

 

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

A:插入排序 (预先排序,运行时间为O(N))    B:堆排序     C:快速排序  (最坏情形O(N2))  D:冒泡排序 (最坏情形O(N2), 最优O(N))

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

Aace      Bacf        Cadf        D:cdf 

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

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

 

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

A:5    B   C:3     D:2 

 

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

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

 

综合题(每题15分)

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

MergeSort利用分治法的原理,依次减小问题的规模。时间复杂度为O(nlog(n)), 空间复杂度为O(N);

[cpp]  view plain copy
  1. void Mergesort(int *p, int n)  
  2. {  
  3.     void Msort(int *p, int *temp, int left, int right);  
  4.     int *temp;  
  5.     if(n <= 0 || p == NULL)  
  6.         return;  
  7.     temp = (int *)malloc(sizeof(int) * n);  
  8.     if(temp == NULL)  
  9.         return;  
  10.     Msort(p, temp, 0, n-1);   
  11.     free(temp);  
  12. }  
  13.   
  14. void Msort(int *p, int *temp, int left, int right)  
  15. {  
  16.     void Merge(int *p, int *temp, int left, int rightbegin, int right);  
  17.     int leftend = (right + left)/2;  
  18.     int rightbegin = leftend+1;  
  19.     if(left < right)  
  20.     {  
  21.         Msort(p, temp, left, leftend);  
  22.         Msort(p, temp, rightbegin, right);  
  23.         Merge(p, temp, left, rightbegin, right);  
  24.     }  
  25. }  
  26.   
  27. void Merge(int *p, int *temp, int left, int rightbegin, int right)  
  28. {  
  29.     int TempArray = rightbegin;  
  30.     int pos = left;  
  31.     int begin = left;  
  32.     while(left < TempArray && rightbegin <= right)  
  33.     {  
  34.         if(p[left] <= p[rightbegin])  
  35.         {  
  36.             temp[pos++] = p[left++];  
  37.         }  
  38.         else if(p[left] > p[rightbegin])  
  39.         {  
  40.             temp[pos++] = p[rightbegin++];  
  41.         }  
  42.     }  
  43.     while(left < TempArray)  
  44.         temp[pos++] = p[left++];  
  45.     while(rightbegin <= right)  
  46.         temp[pos++] = p[rightbegin++];  
  47.     while(pos-- >= begin)  
  48.     {  
  49.         p[pos] = temp[pos];  
  50.     }  
  51. }  



给定一个数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.  请设计一个高效算法实现这个需求。

[cpp]  view plain copy
  1. #include<iostream>  
  2. #include<vector>  
  3.   
  4. using namespace std;  
  5.   
  6. void Find(int *p, int n, int sum);  
  7. void Qsort(int *p, int n);  
  8.   
  9. int main()  
  10. {  
  11.     int *p;  
  12.     int n;  
  13.     int sum;  
  14.     cin>>n;  
  15.     p = new int[n];  
  16.     for(int i = 0; i < n; ++i)  
  17.         cin>>p[i];  
  18.     cin>>sum;  
  19.     Qsort(p, n); //先把输入的数字排序  
  20.     for(int i = 0; i < n; ++i)  
  21.         cout<<p[i]<<" ";  
  22.     cout<<endl;  
  23.     Find(p, n, sum);  
  24. }  
  25.   
  26. void Find(int *p, int n, int sum)  
  27. {  
  28.     void FindSum(int *p, int n, int sum, vector<int> &vec);  
  29.     vector<int> vec;  
  30.     if(p == NULL || n < 0)  
  31.         return;  
  32.     if(sum < p[0])  
  33.         return;  
  34.     else  
  35.         FindSum(p, n, sum,vec);  
  36. }  
  37.   
  38. void FindSum(int *p, int n, int sum, vector<int> &vec)  
  39. {  
  40.     if(sum == 0)  
  41.     {  
  42.         for(vector<int>::iterator iter = vec.begin(); iter != vec.end(); ++iter)  
  43.             cout<<*iter<<" ";  
  44.         cout<<endl;  
  45.         return ;  
  46.     }  
  47.     if(sum < *p || n < 0)  
  48.     {  
  49.         return;  
  50.     }  
  51.     vec.push_back(*p);  
  52.     sum -= *p;  
  53.     FindSum(p+1, n-1, sum, vec);  
  54.     sum += *p;  
  55.     vec.pop_back();  
  56.     while(*p == *(p+1) && p < p+n) //跳过重复的数字  
  57.         p++;  
  58.     FindSum(p+1, n-1, sum, vec);  
  59. }  
  60.   
  61. void Qsort(int *p, int n)  
  62. {  
  63.     void swap(int *, int *);  
  64.     int pivot;  
  65.     int j = -1;  
  66.     if(n <= 1)  
  67.         return;  
  68.     pivot = p[n/2];  
  69.     swap(p+n/2, p+n-1);  
  70.     for(int i = 0; i < n-1; ++i)  
  71.     {  
  72.         if(p[i] < pivot)  
  73.         {  
  74.             j++;  
  75.             if(j != i)  
  76.             {  
  77.                 swap(p+i, p+j);  
  78.             }  
  79.         }  
  80.     }  
  81.     swap(p+j+1, p+n-1);  
  82.     Qsort(p, j+1);  
  83.     Qsort(p+j+2, n-j-2);  
  84. }  
  85.   
  86. void swap(int *a, int *b)  
  87. {  
  88.     int temp;  
  89.     temp = *a;  
  90.     *a = *b;  
  91.     *b = temp;  
  92. }  




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




C&C++部分

选择题(每题5分)

1、int main(void)

{

  int count=0; int m=779;

  while(m)

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

  printf("%d\n",count); return0;

}

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

 

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

int (*n)[10];

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

 

3、int main(void)

{

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

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

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

}

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

 

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

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

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

 

综合题(每题15分)

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

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

思路:创建一个包含1000万个元素的数组,然后遍历10亿个数字,数组用来统计对应数字出现的次数。

如果10亿个数字中0~1000万是随机出现的,可以满足需求。如果有一个数字出现的次数非常的,则数组可能溢出。  


你可能感兴趣的:(2011阿里巴巴集团实习生招聘笔试题 C&C++)