最近准备笔试感觉好麻烦,翻看了之前的笔试题目。自己也做了一下,下面是部分,有的自己也没做。
公共题
选择题(每题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,请尽量考虑性能与资源的占用。
http://blog.csdn.net/cyangc/article/details/22435395转载