【计算机类职业资格】程序员面试-8及答案解析.doc
《【计算机类职业资格】程序员面试-8及答案解析.doc》由会员分享,可在线阅读,更多相关《【计算机类职业资格】程序员面试-8及答案解析.doc(34页珍藏版)》请在麦多课文档分享上搜索。
1、程序员面试-8 及答案解析(总分:100.00,做题时间:90 分钟)一、论述题(总题数:28,分数:100.00)1.什么是泛型编程 (分数:3.00)_2.栈与队列的区别有哪些 (分数:3.00)_3.vector 与 list 的区别有哪些 (分数:3.00)_4.如何实现循环队列 (分数:3.00)_5.如何使用两个栈模拟队列操作 (分数:3.00)_6.如何进行选择排序 (分数:3.00)_7.如何进行插入排序 (分数:3.00)_8.如何进行冒泡排序 (分数:3.00)_9.如何进行归并排序 (分数:3.00)_10.如何进行快速排序 (分数:3.00)_11.如何进行希尔排序 (
2、分数:3.00)_12.如何进行堆排序 (分数:3.00)_13.各种排序算法有什么优劣 (分数:4.00)_14.基础知识 (分数:4.00)_15.如何递归实现二叉树的遍历 (分数:4.00)_16.已知先序遍历和中序遍历,如何求后序遍历 (分数:4.00)_17.如何非递归实现二叉树的后序遍历 (分数:4.00)_18.如何使用非递归算法求二叉树的深度 (分数:4.00)_19.如何判断两棵二叉树是否相等 (分数:4.00)_20.如何判断二叉树是否是平衡二叉树 (分数:4.00)_21.什么是霍夫曼编解码 (分数:4.00)_22.什么是拓扑排序 (分数:4.00)_23.什么是 DF
3、S?什么是 BFS (分数:4.00)_24.如何求关键路径 (分数:4.00)_25.如何求最短路径 (分数:4.00)_26.top K 问题 (分数:4.00)_27.重复问题 (分数:4.00)_28.排序问题 (分数:4.00)_程序员面试-8 答案解析(总分:100.00,做题时间:90 分钟)一、论述题(总题数:28,分数:100.00)1.什么是泛型编程 (分数:3.00)_正确答案:()解析:泛型编程(Generic Programming)的目的是为了发明一种语言机制,能够帮助实现一个通用的标准容器库。通用的标准容器库是指能够实现这样一种功能:例如,用一个 List 类存放
4、所有可能类型的对象,而泛型编程可以让程序员编写完全一般化并可重复使用的算法,其效率与针对某特定数据类型而设计的算法相同。泛型与模板类似,指具有在多种数据类型上皆可操作的含意。 STL 巨大,而且可以扩充,它包含很多计算机基本算法和数据结构,而且将算法与数据结构完全分离,其中算法是泛型的,不与任何特定数据结构或对象类型系在一起。2.栈与队列的区别有哪些 (分数:3.00)_正确答案:()解析:栈与队列是在程序设计中被广泛使用的两种重要的线性数据结构,都是在一个特定范围的存储单元中存储的数据,这些数据都可以重新被取出使用,与线性表相比,它们的插入和删除操作受更多的约束和限定,故又称为限定性的线性表
5、结构。不同的是,栈就像一个很窄的桶先存进去的数据只能最后才能取出来,是 LIFO(Last In First Out,后进先出),它将进出顺序逆序,即先进后出,后进先出。栈结构如图1 所示。队列像日常排队买东西的人的“队列”,先排队的人先买,后排队的人后买,是 FIFO (First In First Out,先进先出)的,它保持进出顺序一致,即先进先出,后进后出。队列结构如图 2 所示。 图 1 栈结构示意图3.vector 与 list 的区别有哪些 (分数:3.00)_正确答案:()解析:vector 为存储的对象分配一块连续的地址空间,对 vector 中的元素随机访问效率很高。在 v
6、ector中插入或者删除某个元素,需要将现有元素进行复制、移动。如果 vector 中存储的对象很大,或者构造函数复杂,则在对现有元素进行拷贝时开销较大,因为拷贝对象要调用拷贝构造函数。对于简单的小对象,vector 的效率优于 list。vector 在每次扩张容量的时候,将容量扩展 2 倍,这样对于小对象来说,效率是很高的。 list 表示非连续的内存区域,并通过一对指向首尾元素的指针双向链接起来从而允许向前和向后两个方向进行遍历,list 中的对象是离散存储的。在 list 的任意位置插入与删除元素的效率都很高,指针必须被重新赋值,但是不需要用拷贝元素来实现移动。它对随机访问的支持并不好
7、,访问一个元素需要遍历中间的元素,另外每个元素还有两个指针的额外空间开销,随机访问某个元素需要遍历 list。在 list 中插入元素,尤其是在首尾插入元素,效率很高,只需要改变元素的指针即可。 vector 内部使用顺序存储,访问速度快,但是删除数据比较耗费性能。list 内部使用链式存储,访问速度慢,但是删除数据比较快。 一般应遵循下面的原则: 1)需要高效的随机存取,而不在乎插入和删除的效率,使用 vector。 2)需要大量的插入和册 0 除,而不关心随机存取,则应使用 list。 3)需要随机存取,而且关心两端数据的插入和删除,则应使用 deque。4.如何实现循环队列 (分数:3.
8、00)_正确答案:()解析:在队列的顺序存储结构中,除了使用一组地址连续的存储单元依次存放从队列头到队列尾的元素之外,还需要另外设置两个指针 front 和 rear 分别指示队列头元素以及队列尾元素的位置。初始化建空队列时,令 front=rear=0,每当插入新的队列尾元素时,“尾指针增 1”,而每当删除队列头元素时,则执行“头指针增 1”。因此,在非空队列中,头指针始终指向队列头元素,尾指针始终指向队列尾元素的下一个位置。 为充分利用向量空间,克服“假溢出”现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。存储在其中的队列称为循环队列(Circular Queue
9、)。循环队列中,由于入队时尾指针向前追赶头指针;出队时头指针向前追赶尾指针,造成队空和队满时头尾指针均相等。因此,无法通过条件front=rear 来判别队列是“空”还是“满”。 解决这个问题的方法至少有两种: 1)另外设置一个标志位来区别队列是“空”还是“满”。 2)少用一个元素空间,约定以“队列头指针在队列尾指针的下一位置(指环状的下一位置)”上作为队列呈“满”状态的标志。队满时:(rear+1)%n=front,n 为队列长度(所用数组大小),由于 rear、front 均为所用空间的指针,循环只是逻辑上的循环,所以需要求余运算。 算法示例如下: #define MAXSIZE 1000
10、 typedef int ElemType; typedef struct ElemType dataMAXSIZE; int front; int rear; CircSeqQueue; 顺序循环队列的初始化 void QueueInitial(CircSeqQueue *pQ) pQ-front=pQ-“rear=0; 顺序循环队列判空 int IsEmpty(CircSeqQueue *pQ) return pQ-front=pQ-rear; 顺序循环队列判满 int IsFull(CircSeqQueue *pQ) return (pQ-rear+1)%MAXSIZE= =pQ-fro
11、nt; 元素进队列 void EnQueue(CircSeqQueue *pQ,ElemType e) if(IsFull(pQ) printf(“列队溢出!/n“); exit(1); pQ-rear=(pQ-rear+1)%MAXSIZE; pQ-datapQ-rear=e; 元素出队列 ElemType DeQueue(CircSeqQueue *pQ) if(IsEmpty(pQ) printf(“空队列!/n“); exit(1); pQ-front=-(pQ-front+1)%MAXSIZE; return pQ-datapQ-front; 取对头元素 ElemType GetFr
12、ont(CircSeqQueue *pQ) if(IsEmpty(pQ) printf(“队列为空!/n“); exit(1); return pQ-data(pQ-front+1)%MAXSIZE; 循环队列置空 void MakeEmpty(CircSeqQueue *pQ) pQ-front=pQ-rear=0;5.如何使用两个栈模拟队列操作 (分数:3.00)_正确答案:()解析:题目要求用两个栈来模拟队列,栈 A 与栈 B 模拟队列 Q,A 为插入栈,B 为弹出栈,以实现队列 Q。 假设 A 和 B 都为空,可以认为栈 A 提供入队列的功能,栈 B 提供出队列的功能。 入队列:入栈
13、A。 出队列分两种情况考虑: 1)如果栈 B 不为空,则直接弹出栈 B 的数据。 2)如果栈 B 为空,则依次弹出栈 A 的数据,放入栈 B 中,再弹出栈 B 的数据。 #includeiostream #includestack using namespace std; template typename T class QueueByDoubleStack public: size_t size(); bool empty(); void push(T t); void pop(); T top(); private: stackT s1; stackT s2; ; template ty
14、pename T size_t QueueByDoubleStackT:size() retum s1.size()+s2.size(); template typename T bool QueueByDoubleStackT:empty() return s1.empty() template typename T void QueueByDoubleStackT:push(T t) s1.push(t); template typename T void QueueByDoubleStackT:pop() if (s2.empty() while(!s1.empty() s2.push(
15、s1.top(); s1.pop(); s2.pop(); template typename T T QueueByDoubleStackT:top() if(s2.empty() while(!s1.empty() s2.push(s1.top(); s1.pop(); return s2.top(); int main() QueueByDoubleStackint q; for (int i=0;i10;+i) q.push(i); while(!q.empty() coutq.top() “; q.pop(); coutendl; return 0; 程序输出结果: 0 1 2 3
16、4 5 6 7 8 9 引申:如何使用两个队列实现栈? 可以采用两种方法实现,入栈:所有元素依次入队列 q1。例如,将 A、B、C、D 四个元素入栈,从队列尾部到队列首部依次为 D、C、B、A,出栈的时候判断栈元素个数是否为 1,如果为 1,则队列 q1 出列;如果不为 1,则队列 q1 所有元素出队列,入队列 q2,最后一个元素不入队列 B,输出该元素,队列 q2 所有元素入队列 q1。例如,将 D、C、B、A 出列,D 输出来,C、B、A 入队列 q2,最后返回到队列 q1 中,实现了后进先出。6.如何进行选择排序 (分数:3.00)_正确答案:()解析:选择排序是一种简单直观的排序算法,
17、它的基本原理如下:对于给定的一组记录,经过第一轮比较后得到最小的记录,然后将该记录与第一个记录的位置进行交换;接着对不包括第一个记录以外的其他记录进行第二轮比较,得到最小的记录并与第二个记录进行位置交换;重复该过程,直到进行比较的记录只有一个时为止。以数组38,65,97,76,13,27,49)为例,具体步骤如下: 第一趟排序后:13 65 97 76 38 27 49 第二趟排序后:13 27 97 76 38 65 49 第三趟排序后:13 27 38 76 97 65 49 第四趟排序后:13 27 38 4997 65 76 第五趟排序后:13 27 38 49 65 97 76 第
18、六趟排序后:13 27 38 49 65 76 97 最后排序结果:13 27 38 49 65 76 97 程序示例如下: #includestdio.h void SelectSort(int *a,int n) int i; int j; int temp=0; int flag=0; for(i=0;in-1;i+) temp=ai; flag=i; for(j=i+1;jn;j+) if(ajtemp) temp=aj; flag=j; if(flag!=i) aflag=ai; ai=temp; int main() int i=0; int a=5,4,9,8,7,6,0,1,3
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
5000 积分 0人已下载
下载 | 加入VIP,交流精品资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 职业资格 程序员 面试 答案 解析 DOC
