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

最近准备笔试感觉好麻烦,翻看了之前的笔试题目。自己也做了一下,下面是部分,有的自己也没做。


公共题

选择题(每题5分)

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

A:9    B11    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   C:3     D:2 

 解析:B

                            10

                    5                   19 

              4         7            13

           3          6

        1

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

A:20    B:22      C26    D:32 

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

 

综合题(每题15分)

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

 归并排序(MergeSort)

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

  1. #include <iostream>  
  2. using namespace std;  
  3. void merge(int* a,int m,int n,int s)  
  4. {  
  5.     //开辟一个空间存放返回值   
  6.     int *re=(int*)malloc(sizeof(int)*n);  
  7.     int temp=s++,k=m,low=m;  
  8.     while(m<=temp&&s<=n)  
  9.     {  
  10.         if(a[m]<=a[s])re[k++]=a[m++];  
  11.         else re[k++]=a[s++];  
  12.     }  
  13.     while(s<=n)re[k++]=a[s++];  
  14.     while(m<=temp)re[k++]=a[m++];  
  15.     for(k=low;k<=n;k++)a[k]=re[k];  
  16. }  
  17. int MergeSort(int* a,int m,int n)  
  18. {  
  19.     if(a==NULL)  
  20.     {  
  21.         return 1;  
  22.     }  
  23.     int s;  
  24.     if(m<n)  
  25.     {  
  26.         s=(n+m)/2;  
  27.         MergeSort(a,m,s);  
  28.         MergeSort(a,s+1,n);  
  29.         merge(a,m,n,s);  
  30.     }  
  31. }   
  32. int main()  
  33. {  
  34.     int src[] = {49,38,65,97,76,13,27,49};    
  35.     
  36.     int i,j,cnt = sizeof(src)/4;    
  37.         
  38.     MergeSort(src,0,cnt-1);    
  39.     
  40.     //输出    
  41.     for(i = 0; i < cnt; i ++) cout<<src[i]<<" ";    
  42.     cout<<endl;    
  43.     
  44.     getchar();    
  45.     return 0;   
  46. }  

 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      C5     D:8

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

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

int (*n)[10];

请问调用函数sizeof(n),返回值为(  A   )  A4      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      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,请尽量考虑性能与资源的占用。



http://blog.csdn.net/cyangc/article/details/22435395转载


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值