完整试题:
參考:http://blog.csdn.net/wangran51/article/details/8876234。
以下的【分析】是我给出的。
选择题(每题5分)
1. 若一棵二叉树具有10个度为2的结点,则该二叉树的度为0的结点个数是( )
A:9 B:11 C:12 D:不确定
2.下列排序算法中,其时间复杂度和记录的初始排列无关的是( )
A:插入排序 B:堆排序 C:高速排序 D:冒泡排序
3.已知中序遍历的序列为abcdef,高度最小的可能的二叉树的叶子是( )
A:ace B:acf C:adf D:cdf
4.參加百年阿里培训的n位同学结伴去西湖旁边为游人指路,两人一组,他们打算先让体重之和恰好为102公斤的同学一组,请给出一个算法找到这种组合,或者确定他们中不存在这种组合,当中最优的算法时间复杂度为?(如果体重均为整数)( )
A:O(log(n)) B:O(n) C:O(n log(n)) D:O(n^2)
【分析】经典问题,数组中随意两个数的和等于给定数。
5.众所周知数据结构中很主要的树结构包含二叉查找树(BST)。当我们把例如以下序列:10,5,19,4,13,7,6,3,1按顺序建立一棵BST时,树的最大深度是?(令根节点深度为0,运行不进行平衡的基本插入)( )
A:5 B:4 C:3 D:2
6.阿里巴巴启用了新的办公大厦,这里的一切都充满了现代感;project师们打算在娱乐区用大小相等的圆形材料切割出一些空间,使用A,B,C三个圆形材料,最多能够将空间分为八个区域(包含圆形以外的区域),假设给你五个圆形材料,你最多能够帮助project师们分出多少个空间?( )
A:20 B:22 C:26 D:32
【分析】:3个圆:把空间分为8各区域,图例如以下,圆中有7个区域,加上圆外的区域,共8个。
4个圆:随意两圆都相交且随意三圆不交于同一点时分平面的部分数最多,第四个圆被前三个圆分成六段圆弧,每一段圆弧将原来所在平面区域又分成两部分,所以添加了6个部分,三个圆最多能将平面分成8+6个=14个部分;
5个圆:随意两圆都相交且随意三圆不交于同一点时分平面的部分数最多,第五个圆被前四个圆分成八段圆弧,每一段圆弧将原来所在平面区域又分成两部分,所以添加了8个部分,三个圆最多能将平面分成14+8个=22个部分.
通项公式:F(n)=F(n-1)+2*(n-1),n≥2,F(1)=2
选择题(每题5分)
1、 有例如以下一段代码,请选择其执行结果:( )
public classTest {
private static final String MESSAGE ="taobao";
public static void main(String[] args) {
// TODO Auto-generated method stub
Stringa = "tao" + "bao";
Stringb = "tao";
Stringc = "bao";
System.out.println(a ==MESSAGE);
System.out.println((b +c) == MESSAGE);
}
}
A true true B false false C true false D false true
【分析】:a和MESSAGE引用同一个对象,而(b + c)不是一个对象。
2、 下面哪几种方式可用来实现线程间通知和唤醒:( )
A Object.wait/notify/notifyAll B ReentrantLock.wait/notify/notifyAll
C Condition.await/signal/signalAll D Thread.wait/notify/notifyAll
3、 下面集合对象中哪几个是线程安全的?( )
A ArrayList B Vector C Hashtable D Stack
【分析】:ArrayList是线程不安全的,轻量级的,Vector是线程安全的,重量级的,stack继承自Vector。
4、 有下面一段代码,请选择其执行结果。( )
public classSpike {
public static void main(String[] args) {
Countera = new Counter();
System.out.println(a.increment());
System.out.println(a.anotherIncrement());
Counterb = new Counter();
System.out.println(b.increment());
}
}
class Counter {
private static int count = 0;
public int increment() {
returncount++;
}
public int anotherIncrement() {
return ++count;
}
}
A: 1 1 1 B: 1 2 3 C: 0 2 2 D: 0 2 0
综合题(每题15分)
1) 分析MergeSort的原理以及算法复杂度,并用最擅长的编程语言实现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. 请设计一个高效算法实现这个需求。
【分析】:经典的“子集和问题”,用回溯法求解,我还在学习中。