第一题,基础题:
1. 数据库及线程产生死锁的原理和必要条件,如何避免死锁。
百度说明:
http://baike.baidu.com/view/121723.htm
2. 列举面向对象程序设计的三个要素和五项基本原则。
三个要素:封装 继承 多态
五项基本原则:
单一职责原则(SRP)
开放封闭原则(OCP)
里氏替换原则(LSP)
依赖倒置原则(DIP)
接口隔离原则(ISP)
1:单一职责原则
一个类应该仅有一个引起它变化的量(最简单,最容易理解却是最不容易做到的一个设计原则)
职员类例子:
比如在职员类里,将工程师、销售人员、销售经理这些情况都放在职员类里考虑,其结果将会非常混乱,在这个假设下,职员类里的每个方法都要if else判断是哪种情况,从类结构上来说将会十分臃肿,并且上述三种的职员类型,不论哪一种发生需求变化,都会改变职员类!这个是大家所不愿意看到的!
2:开放封闭原则
即开放又封闭,对扩展是开放的,对更改是封闭的
扩展即扩展现行的模块,当我们软件的实际应用发生改变时,出现新的需求,就需要我们对模块进行扩展,使其能够满足新的需求!
更改封闭既是在我们对模块进行扩展时,毋须对原有程序代码和DLL进行修改或重新编译文件
这个原则对我们在设计类的时候很有帮助,坚持这个原则就必须尽量考虑接口封装,抽象机制和多态技术!
3:里氏替换原则
子类可以替换父类并且出现在父类能够出现的任何地方
这个原则也是在贯彻GOF倡导的面向接口编程
在这个原则中父类应尽可能使用接口或者抽象类来实现
子类通过实现了父类接口,能够替父类的使用地方,通过这个原则,我们客户端在使用父类接口的时候,通过子类实现
意思就是说我们依赖父类接口,在客户端声明一个父类接口,通过其子类来实现
这个时候就要求子类必须能够替换父类所促火线的任何地方,这样做的好处就是,在更具新要求扩展父类接口的新子类的时候而不影响当前客户端的使用
4:依赖倒置原则
传统的结构化编程中,最上层的模块通常都要依赖下面的子模块来实现,也称为高层依赖底层
所以依赖倒置原则就是要逆转这种依赖关系吗,让高层模块不要依赖底层模块,所以称之为依赖倒置原则
5:接口隔离原则
这个原则的意思就是:使用多个专门的接口比使用单个接口要好的多
3.Windows内存管理的方式有哪些?各自的优缺点。
WINDOWS内存管理方式主要分为:段式管理,页式管理、段页式管理
页式管理:页式管理的基本原理将各进程的虚拟空间划分成若干个长度相等的页(PAGE),页式管理把内存空间按页的大小划分成片或者页面(page frame),然后把页式虚拟地址与内存地址建立一一对应页表,并用相应的硬件地址变化机构,来解决离散地址变换问题。页式管理采用请求调页或预调页技术实现了内外存存储器的统一管理。其优点是没有外碎片,每个内碎片不超过页大小。一个程序不必连续存放。便于改变程序占用空间的大小(主要指随着程序运行而动态生成的数据增多,要求地址空间相应增长,通常由系统调用完成而不是操作系统自动完成)
缺点:程序全部装入内存,要求有相应的硬件支持。例如地址变化机构,缺页中断的产生和选择淘汰页面等都要求有相应的硬件支持。这增加了机器成本。增加了系统开销,例如缺页中断处理机制,请求调页的算法如选择不当,有可能产生抖动现象。虽然消除了碎片,但每个作业或进程的最后一页内总有一部分空间得不到利用或页面较大,则这一部分的损失依然较大
段式管理:段式管理的基本思想就是把程序按内容或过程(函数)关系分成段,每段有自己的名字。一个用户作业或进程所包含的段对应一个二维线形虚拟空间,也就是一个二维虚拟存储器。段式管理程序以段为单位分配内存,然后通过地址映射机构把段式虚拟地址转换为实际内存物理地址。程序通过分段(segmentation)划分为多个模块,如代码段、数据段、共享段。
优点:可以分别编写和编译。可以针对不同类型的段采取不同的保护。可以按段为单位来进行共享,包括通过动态链接进行代码共享。
段页式管理:为了实现段页式管理,系统必须为每个作业或进程建立一张段表以管理内存分配与释放,缺段处理,存储保护及地址变换等。另外,由于一个段又被划分成了若干页,每个段又必须建立一张页表以把段中的虚页变换成内存中的实际页面。显然,与页式管理时相同,页表中也要有相应的的实现缺页中断处理和页面保护等功能的表项。另外,由于在段页式管理中,页表不再是属于进程而是属于某个段,因此,段表中应有专项指出该段所对应页表的页表始址和页表长度。因为段页式管理是段式管理和页式管理方案结合而生成的,所以具有他们二者的优点。但反过来说,由于管理软件的增加,复杂性和开销就随之增加了。另外,需要的硬件以及占用的内存也有所增加,更重要的是,如果不采用联想寄存器的方式提高CPU的访问速度,将会使得执行速度大大下降。
第二题,算法与程序设计:
1.公司举行羽毛球比赛,采用淘汰赛,有1001个人参加,要决出“羽毛球最高选手”,应如何组织这次比赛?可以使用伪代码。
2.有100盏灯泡,第一轮点亮所有电灯,第二轮每两盏灯熄灭一盏,即熄灭第2盏,第4盏,以此类推,第三轮改变编号为3的倍数的电灯,第3盏,第6盏,如果原来那盏灯是亮的,就熄灭它,如果原来是灭的,就点亮它,以此类推,直到第100轮。问第100结束后,还有多少盏灯泡是亮的?
3.有20个有序数组,每个数组有500个uint变量,降序排序。要求从这10000个元素中选出最大的500个。
第三题,系统设计题:
手机数字键上有拼音字母,一个数字串对应着多个字母序列,如2--ABC,6--MNO,9--WXYZ,则926对应着WAN,YAN,是汉字“万”、“艳”的拼音等。要求设计一个系统,输入是联系人列表UserList<UserName, PhoneNo>,汉字字母映射Dict,数字串NumStr,输出满足下列条件的联系人列表ResultList<UserName, PhoneNo>:
(1)输入一个数字串,输出与其部分连续匹配的所有手机号,如,输入926,输出13926118288
(2)输入一个数字串,输出与其部分连续匹配的所有联系人姓名拼音,如输入926,输出“李万”,“李艳”等。