一.选择题:
1. A,B,O,AB血型的比例为:10%,20%,30%,40%,现在选择一批人,如果需要这批人中,至少有一个是B型血的概率不小于90%,那么至少应该选择几个人?
A.9 B.10 C.11 D:12
解析:题目要求,至少有一个是B型血,那么我们可以求:一个B型血也没有,假设选择x个人,则有1-0.8^x >=0.9 即求0.8^x <= 0.1 。解之得x至少为11
2. 二分查找,假设查找的记录数为627647,最坏情况下需要查找多少次?
A: 17 B:18 C:19 D:20
解析:二分查找,最坏情况下,是在最后一个区间才能查找到记录数(或失败),需要的查找次数最多为ceil(logn),即取上限,
3. 4只老鼠,A说:今晚我们都偷奶酪了 B:我只偷樱桃了。c:我没偷奶酪 D:我们之中有人没偷奶酪。它们4个只有一个是对的,问是哪一个?
A: A B: B C: C D: D
解析:一个一个进行假设,推出悖论即可。例如,假设只有B是对的,那么B只偷了樱桃,那么推出D也是对的,与只有一个是对的矛盾,故不对。A是对的。
4. 快速排序的平均和最坏情况下的时间复杂度是:
A:O(n) ,O(n) B:O(n^2),O(n^2) C:O(nlogn),O(nlogn) D:O(nlogn),O(n^2)
解析:快排的性能:平均时间复杂度O(nlogn),最坏情况下的时间复杂度 O(n^2),最坏情况产生的条件:每次划分的结果都是1个元素和n-1个元素。则快速排序退化,需要的时间复杂度为O(n^2)
5.数据库中E-R图转化为关系模型,下面错误的是?
A.一个实体转换为一个关系模型
B.一个关联转换为一个关系模型
C.实体转换为关系模型时,实体的主键就是关系模型的主键
D.关联转换为关系模型时,关系模型的主键是所有关联实体的属性及联系本身的属性。
解析:E-R图转换为关系模型的原则有:
(1)一个实体型转换为一个关系模式。
关系的属性:实体型的属性。
关系的码:实体型的码。
(2)一个m:n联系转换为一个关系模式。
关系的属性:与该联系相连的各实体的码以及联系本身的属性。
关系的码:各实体码的组合。
(3) 一个1:n联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并
(4) 一个1:1联系可以转换为一个独立的关系模式,也可以与任意一端对应的关系模式合并。
6.高度为h二叉树的二叉树的节点数最多有()个,根节点的高度为1?
A. 2^h B.2h C.2^(h-1) D.2^h - 1
解析:满二叉树的节点数最多,最多为2^h -1个节点
7.忘记
8.忘记
9. 序列 6,7,4,2,8,1,___下一个数字最有可能是几?
A.6 B.7 C.8 D.9
解析:观察规律:6*7 = 42 ,4*2 = 8 , 2*8=16 则下一个数字应该为6
10.下面的程序,while循环会执行多少次?
unsigned char k = 20;
while(k>=0){
k--;
}
A. 20次 B.一次也不执行 C.无限循环 D.21次
解析:注意k是unsigned char类型,也就是无符号字节型的,故k>=0始终是成立的,因而会无限循环
11.对于一个非空二叉树。下列说法错误的是:
A.有两个子节点的节点数一定比没有子节点的节点数少1。
B.深度为h的二叉树节点最底层最多含有2^h个节点(根的深度度为0)
C.根据二叉树的前序和中序遍历结果,一定可以求出后序遍历结果。
D.堆一定是一个完全二叉树。
解析:堆不一定按照完全二叉树组织。完全二叉树是堆的一种实现形式。
12.下列排序需要的空间复杂度最大的是?()
A.冒泡排序 B.快速排序 C.堆排序 D.希尔排序
解析:冒泡排序和堆排序需要一个额外的元素来实现交换,希尔排序需要记录增量的一个变量。 快速排序的递归实现则需要一个栈空间来实现递归,平均情况下,需要O(nlgn)的额外空间
13. 王sir家有两个孩子, 其中一个是女孩子,请问另外一个也是女孩子的概率是()?
A. 1/4 B.1/2 C.1/6 D.1/8
解析:独立事件的概率 1/2
14.以下哪一个不属于链表优于数组的表现?()
A.插入方便 B.删除方便 C.插入删除时不需要移动元素 D.更加节省存储空间。
解析:由于链表需要额外的空间记录指针等,因而实际上比数组更加浪费空间(不够紧凑)
15.以下哪一个不是单链表的特点?____
A.插入方便
B.删除方便
C.可以直接访问链表的第i个元素。
D.插入和删除时不需要移动元素。
解析:单链表不支持随机访问,访问节点需要从头指针遍历。
16.下列程序中,执行test()函数后的结果是:
void test(){
class B{
public:
B(){
cout<<"B\t"<<endl;
}
~B(){
cout<<"~B\t"<<endl;
}
};
struct C{
C(){
cout<<"C\t"<<endl;
};
~C(){
cout<<"~c\t"<<endl;
};
};
struct D:B{
D(){
cout<<"D\t"<<endl;
};
~D(){
cout<<"~D\t"<<endl;
};
C c;
};
D d;
}
A. D C B ~B ~C ~D
B. B C D ~D ~C ~B
C. C B D ~D ~B ~C
D. C D B ~B ~D ~C
解析:实例化时,父类比子类先实例化。析构时,顺序相反
17.到商店里买200的商品返还100优惠券(可以在本商店代替现金)。请问实际上折扣是多少?
A. 75%
B. 66.7%
C. 60%
D. 33.3%
解析:相当于花费200元买到价值300元的东西,则折扣为(300-200)/300 = 33.3%
18.const char * const p下列的操作正确的是:
A. p++
B.(*p)++;
C.*p = null;
D.以上都不对
解析:指针和指针所指的空间都被修饰为const,是不允许修改的
19.
20.
二.填空题:
1.冒泡排序的时间复杂度是__O(n^2)__
2.中奖概率:3个箱子,有一个有奖,抽取一个,然后主持人打开一个空的(无奖),然后问是否更换,问下不更换抽中的一个中奖的概率是 1/2 ?,更换为另外一个箱子中奖的概率是_1/2_?
3.高度为h的二叉树,最底层最多有__2^h__个节点,?
4.四个节点的二叉树共有__14__种形态?
解析:含有n个节点的二叉树的形态的数字为卡特兰数 C(2n,n)/(n+1)
5.下面程序的输出是?_1,3,2_
void test(int *a,int *b){
*a = *a + *b;
*b = *a - *b;
*a = *a - *b;
}
int a = 1,b =2,c = 3;
test(&a,&b);
test(&b,&c);
test(&a,&c);
printf("%d,%d,%d",a,b,c);
解析:test()实现两个数交换。
6.数组a[60][70],按照列优先存储,每个元素占据2个单元。假设a[0][0]的地址是1024.则a[32][58]的地址是: 8048__
注意是列优先存储。
7.对于无序数组20,18,22,19,16,21,32.将数组按照升序排列,以元素20为枢轴元素,则快速排序一趟的结果是_18,16,19,20,22,21,32__
8.c语言中的参数传递方式有_ 值__传递和_引用__传递
9.忘记
10.忘记
三。问答题
1. 单向循环链表,从头开始报数,报道m或其倍数时,出列,按照出列的先后顺序从新组织单链表
函数原型为: void convert(Node**head,int m);
解析:约瑟夫环的形式。head为二级指针,是重新组织后的循环单链表的表头。
2. 海量数据Top100
a.一天的优酷视频播放量约1亿,视频总数约有100w。ID号是一个大小为20字节的字符串。如何求出当天播放视频的Top100
可抽象为一个大文件,每行一个ID号,代表被播放的视频id。机器的内存不超过1G,如何抽取TOP100.先写思路,然后写程序。
b.同样一个月的视频播放量约100亿。求出当月的视频播放top100,每台机器的内存不超过1G.描述所有可能的解决方案。
解析:海量数据的处理。无法一次性装入内存,可先hash之分为多个文件处理,堆或者Trie树统计次数,求出每个文件中的Top 100。归并之求出总的top 100
对于第二问:还可以hadoop mapReduce处理之。
3. 1-n中找缺失的数字,有n-1个数字,每一个都位于1-n之间,但是之中缺失了一个数字,要求找出这个缺失的数字,线性时间复杂度
解析:异或。原理:相同的数异或为0,0与其他数异或结果为该数。