1).设计模式中,属于结构型模式的有哪些?
A) 状态模式
B) 装饰模式
C) 代理模式
D) 观察者模式
解答:BC
结构型设计模式是从程序的结构上解决模块之间的耦合问题。包括以下七种模式:
1.Adapte适配器模式 2. Bridge 桥接模式 3. Composite 组合模式 4.Decorator装饰模式 5. Facade 外观模式 6. Flyweight 享元模式 7. Proxy 代理模式
1.Adapte适配器模式:Adapter 模式通过类的继承或者对象的组合侧重于转换已有的接口,类适配器采用“多继承”的实现方式,带来了不良的高耦合,所以一般不推荐使用。对象适配器采用“对象组合”的方式,更符合松耦合精神。
例如:笔记本 电源适配器,可以将220v转化为适合笔记本使用的电压。
2.Bridge 桥接模式:将抽象部分与实现部分分离,使它们都可以独立的变化。 减少因变化带来的代码的修改量。
例如:经典例子,电灯开关,开关的目的是将设备打开或关闭,产生的效果不同。
3. Composite 组合模式: 将对象组合成树形结构以表示“部分 - 整体”的层次结构。 Composite 模式使得客户对单个对象和组合对象的使用具有一致性。从而解决了 解决客户程序与复杂对象容器的解耦,即: 通过继承统一的接口,我们可以将容器对象及其子对象看成同一类对象使用,以减少对象使用中的复杂度。
例如: 让用户一致地使用单个对象和组合对象,1 +2 和( 1+1 ) + ( 2*3 )都是合法的表达式。 单个与整体都可以进行加法运算符的操作。
4.Decorator装饰模式:动态地给一个对象添加一些额外的职责。就增加功能来说, Decorator 模式相比生成子类更为灵活。 [GOF 《设计模式》 ] Decorator 模式采用对象组合而非继承的手法,实现了在运行时动态的扩展对象功能的能力,而且可以根据需要扩展多个功能,避免了单独使用继承带来的“灵活性差”和“多子类衍生问题”。同时它很好地符合面向对象设计原则中“优先使用对象组合而非继承”和“开放 - 封闭”原则。
例如:一幅画,可以直接挂到墙上,也可以加上框架和镶上玻璃后,再挂到墙上。
5. Facade 外观模式: 为子系统中的一组接口提供一个一致的界面, 简化接口。
例如:我们拨打10086,可以办理,彩铃,手机报,全时通等业务(子对象),而10086则是为子对象所使用的一致界面。
6. Flyweight 享元模式: 运用共享技术有效地支持大量细粒度的对象。 [GOF 《设计模式》 ]。 解决: 面向对象的思想很好地解决了抽象性的问题,一般也不会出现性能上的问题。但是在某些情况下,对象的数量可能会太多,从而导致了运行时的代价。那么我们如何去避免大量细粒度的对象,同时又不影响客户程序使用面向对象的方式进行操作 ,享元模式的出现恰好解决了该问题。
例如: 公共交换电话网( PSTN )是享元的一个例子。有一些资源例如拨号音发生器、振铃发生器和拨号接收器是必须由所有用户共享的。当一个用户拿起听筒打电话时,他不需要知道使用了多少资源。对于用户而言所有的事情就是有拨号音,拨打号码,拨通电话。
7. Proxy 代理模式: 为其他对象提供一种代理以控制这个对象的访问。 解决直接访问某些对象是出现的问题。
例如:律师本身就是我们维权的一个代理!
2)如何减少换页错误?
A) 进程倾向于占用CPU
B) 访问局部性(locality of reference)满足进程要求
C) 进程倾向于占用I/O
D) 使用基于最短剩余时间(shortest remaining time)的调度机制
解答: BC
3) 下列排序算法中,哪些时间复杂度不会超过nlogn?
A) 快速排序
B) 堆排序
C) 归并排序
D) 冒泡排序
解答:BC
常见排序算法的复杂度,如图(1)、图(2)所示:


由图(1)、图(2)可知,在最坏情况下,堆排序、快速排序、希尔排序的时间复杂度不会超过nlogn,即选BC。
4)进程进入等待状态有哪几种方式?
A) CPU调度给优先级更高的线程
B) 阻塞的线程获得资源或者信号
C) 在时间片轮转的情况下,如果时间片到了
D) 获得spinlock未果
解答:D
进程分为基本的三个状态:运行、就绪、阻塞/等待。
A. 高优先级的抢占CPU,使得原来处于运行状态的进程转变为就绪状态。
B. 阻塞的进程等待某件事情的发生,一旦发生则它的运行条件已经满足,从阻塞进入就绪状态。
C. 时间片轮转使得每个进程都有一小片时间来获得CPU运行,当时间片到时从运行状态变为就绪状态。
D. 自旋锁(spinlock)是一种保护临界区最常见的技术。在同一时刻只能有一个进程获得自旋锁,其他企图获得自旋锁的任何进程将一直进行尝试(即自旋,不断地测试变量),除此以外不能做任何事情。因此没有获得自旋锁的进程在获取锁之前处于忙等(阻塞状态)。
5)有ABCDEF 六个城市,每一个城市都和其他所有城市直接相连,问从A——B有多少种连接方式,路径不允许在两个城市之间往返?
A) 78
B) 65
C) 43
D) 以上都错
解答:B
排列组合问题,除去A和B,剩下的进行排列,A和B之间经过4、3、2、1、0个城市,即排列方式有:
4选4排列+4选3排列+4选2排列+4选1排列+4选0排列
= A[4,4] + A[4,3] + A[4,2] +A[4,1] + A[4,0] = 24+24+12+4+1 = 48 + 16 +1 =65。
6)十字链表是无向图的一种存储结构( )
A) 对
B) 错
解答:B
无向图的存储结构有:邻接矩阵、邻接表、邻接多重表。
有向图的存储结构有:十字链表、邻接矩阵、邻接表。即选B。
7)一个有向无环图的拓扑排序序列( )是唯一的
A) 一定
B) 不一定
解答:不一定,选B
可以举一个很简单的反例
三个顶点 1,2,3
两条边 1->3,2->3
序列:1,2,3跟2,1,3,都是合法的拓扑排序
8)关于操作系统heap与stack说法中,正确的是()。
A) stack由编译器自动分配和释放,存放函数的参数值,局部变量,全局变量的值
B) heap一般由程序员分配和释放,若程序员不释放,可能会造成操作系统的内存泄露
C) stack由系统自动分配,无需程序员干涉,heap需要手动申请
D) heap与stack都会在初始大小空间用满时,系统自动增加其大小
解答:BC
操作系统中,内存一般分为3个部分:代码区、静态数据区和动态数据区。
静态数据区:存储全局变量、静态变量;
动态数据区:存储局部变量;
动态数据区 = stack + heap。
stack(也叫栈,堆栈),是一种后进先出的线性结构,操作系统的”堆栈”,一般就是指栈,由系统自动分配,自动回收。在VC6.0中,stack的大小一般为2M,不会自动增加。stack一般存放函数的参数列表、返回值、局部变量。
heap(也叫堆),一种链式结构,操作系统的”堆”和数据结构里的”堆”不同,前者只是一个分配机制;而后者涉及筛选和重构,属于排序机制。heap由程序员手动分配、手动回收。heap一般存放局部变量。
所以,排除A和D,即选B和C。
9)对于定义”int *p”,下列哪些说明可能是正确的?
A) p是一个指向int型值的指针
B) p是一个指向一维数组的指针
C) p是一个指向二维数组的指针
D) p是一个动态数组
解答:ABD
举例如下:
A.这个很明显是对的。
B.有如下程序,此时P为指向一维数组的指针
int arr[10];
int *p=arr;
C.指向二维数组
int arr[10][10];
int (*p)[10];
p=arr;
D.在函数中声明动态数组,因为在编译阶段并不知道len大小,所以只能如下面一样声明动态数组
int func(int len){
int *p=new int[len];
}