ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:23.58KB ,
资源ID:4696391      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4696391.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(程序员面试精选.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

程序员面试精选.docx

1、程序员面试精选程序员经典1双向链表的查找节点。考点:双向链表的操作出现频率:解析:使用right指针遍历,直至找到数据为data的节点,如果找到节点,返回节点,否则返回NULL。1/查找节点,成功则返回满足条件的节点指针,否则返回NULL2DbNode*FindNode(DbNode*head,intdata)/参数1是链表的表头节点3/参数2是要查找的节点,其数据为data4DbNode*pnode=head;56if(head=NULL)/链表为空时返回NULL78returnNULL;91011/*找到数据或者到达链表末尾退出while循环*/12while(pnode-right!=N

2、ULL&pnode-data!=data)1314pnode=pnode-right;/使用right指针遍历151617/没有找到数据为data的节点,返回NULL18if(pnode-right=NULL)1920returnNULL;212223returnpnode;242考点:模板的特化的理解出现频率:解析:模板的特化(templatespecialization)分为两类:函数模板的特化和类模板的特化。(1)函数模板的特化:当函数模板需要对某些类型进行特别处理,称为函数模板的特化。例如:1boolIsEqual(Tt1,Tt2)23returnt1=t2;456intmain()7

3、8charstr1=Hello;9charstr2=Hello;10coutIsEqual(1,1)endl;11coutIsEqual(str1,str2)endl;/输出012return0;13代码11行比较字符串是否相等。由于对于传入的参数是char*类型的,max函数模板只是简单的比较了传入参数的值,即两个指针是否相等,因此这里打印0。显然,这与我们的初衷不符。因此,max函数模板需要对char*类型进行特别处理,即特化:1template2boolIsEqual(char*t1,char*t2)/函数模板特化34returnstrcmp(t1,t2)=0;5这样,当IsEqual函

4、数的参数类型为char*时,就会调用IsEqual特化的版本,而不会再由函数模板实例化。(2)类模板的特化:与函数模板类似,当类模板内需要对某些类型进行特别处理时,使用类模板的特化。例如:1template2classcompare34public:5boolIsEqual(Tt1,Tt2)67returnt1=t2;89;1011intmain()1213charstr1=Hello;14charstr2=Hello;15comparec1;16comparec2;17coutc1.IsEqual(1,1)endl;/比较两个int类型的参数18coutc2.IsEqual(str1,str

5、2)endl;/比较两个char*类型的参数19return0;20这里代码18行也是调用模板类compare的IsEqual进行两个字符串比较,显然这里存在的问题和上面函数模板中的一样,我们需要比较两个字符串的内容,而不是仅仅比较两个字符指针。因此,需要使用类模板的特化:1template2classcompare/特化(char*)34public:5boolIsEqual(char*t1,char*t2)67returnstrcmp(t1,t2)=0;/使用strcmp比较字符串89;注意:进行类模板的特化时,需要特化所有的成员变量及成员函数。3考点:双向链表的操作出现频率:解析:与测长

6、的方法一样,使用right指针进行遍历。1/打印整个链表2voidPrintList(DbNode*head)/参数为链表的表头节点34DbNode*pnode=NULL;56if(head=NULL)/head为NULL表示链表空78return;910pnode=head;11while(pnode!=NULL)1213printf(%d,pnode-data);14pnode=pnode-right;/使用right指针遍历1516printf();174考点:类模板的实例化的理解出现频率:1template2classArray34;5voidfoo()67Arrayarr1;8Arr

7、ayarr4,arr5;9Arrayarr2,arr3;10Arrayarr6;1112HowmanyinstancesofthetemplateclassArraywillgetinstantiatedinsidethefunctionfoo()A3B6C4D1解析:模板类(templateclass)的实例个数是由类型参数的种类决定的。代码7行和9行实例化的模板类都是Array,代码8行实例化的模板类是Array,代码10行实例化的模板类是Array。一共是三个实例。答案:A5考点:双向链表的操作出现频率:解析:为了得到双向链表的长度,需要使用right指针进行遍历,直到得到NULL为止。

8、1/获取链表的长度2intGetLength(DbNode*head)/参数为链表的表头节点34intcount=1;5DbNode*pnode=NULL;67if(head=NULL)/head为NULL表示链表空89return0;1011pnode=head-right;12while(pnode!=NULL)1314pnode=pnode-right;/使用right指针遍历15count+;161718returncount;19更多精彩内容,请到“融智技术学苑rzchina”使用模板有什么缺点?如何避免?6考点:理解模板编程的缺陷出现频率:解析:templates(模板)是节省时间

9、和避免代码重复的极好方法,我们可以只输入一个类模板,就能让编译器实例化所需要的很多个特定类及函数。类模板的成员函数只有被使用时才会被实例化,所以只有在每一个函数都在实际中被使用时,我们才会得到这些函数。确实这是一个很重要的技术,但是如果不小心,使用模板可能会导致代码膨胀。什么是代码膨胀?请看下面的例子:1template2classA34public:5voidwork()67coutwork()endl;8coutnumendl;910;1112intmain()1314Av1;15Av2;16Av3;17Av4;18v1.work();19v2.work();20v3.work();21v

10、4.work();22return0;23类模板A取得一个类型参数T,并且它还有一个类型为int的参数,一个非类型参数(non-typeparameter),与类型参数相比,虽然非类型参数不是很通用,但他们是完全合法的。在本例中,由于num的不同,代码14到17行的调用将会生成了三个A的实例,然后在1821行又生成了不同的函数调用。虽然这些函数做了相同的事情(打印一个“work()”和num),但他们却有不同的二进制代码。这就是所说的由于模板导致的代码膨胀。也就是说,虽然源代码看上去紧凑而整洁,但是目标代码却臃肿而松散,会严重影响程序的运行效率。如何避免由于这种代码膨胀呢?有一个原则,就是把C

11、+模板中与参数无关的代码分离出来。也就是让与参数无关的代码只有一份拷贝。对类模板A可以进行如下地修改:1template2classBase34public:5voidwork(intnum)67coutwork;8coutnumdata=data;6pnode-left=pnode-right=pnode;/创建新节点时7/让其前驱和后继指针都指向自身8returnpnode;91011/创建链表12DbNode*CreateList(inthead)/参数给出表头节点数据13/表头节点不作为存放有意义数据的节点14DbNode*pnode=(DbNode*)malloc(sizeof(Db

12、Node);15pnode-data=head;16pnode-left=pnode-right=pnode;1718returnpnode;192021/插入新节点,总是在表尾插入;返回表头节点22DbNode*AppendNode(DbNode*head,intdata)/参数1是链表的表头节点,23/参数2是要插入的节点,其数据为data24DbNode*node=CreateNode(data);/创建数据为data的新节点25DbNode*p=head,*q;2627while(p!=NULL)2829q=p;30p=p-right;3132q-right=node;33node-l

13、eft=q;3435returnhead;36我们可以使用其中的CreateList()和AppendNode()来生成一个链表,下面是一个数据生成从0到9含有10个节点的循环链表。1DbNode*head=CreateList(0);/生成表头,表头数据为023for(inti=1;i10;i+)45head=AppendNode(head,i);/添加9个节点,数据为从1到968考点:函数模板与类模板的基本概念和区别出现频率:解析:(1)什么是函数模板和类模板。函数模板是一种抽象函数定义,它代表一类同构函数。通过用户提供的具体参数,C+编译器在编译时刻能够将函数模板实例化,根据同一个模板创

14、建出不同的具体函数,这些函数之间的不同之处主要在于函数内部一些数据类型的不同,而由模板创建的函数的使用方法与一般函数的使用方法相同。函数模板的定义格式如下:1templateFunction_Definition其中,Function_Definition为函数定义;TYPE_LIST被称为类型参数表,是由系列代表类型的标识符组成的,其间用逗号分隔,这些标识符的通常风格是由大写字母组成,ARG_LIST称为变量表,其中含有由逗号分隔开的多个变量说明,相当于一般函数定义中的形式参数。前面例题中的max就是函数模板的一个例子,因此这里不再另外举例。C+提供的类模板是一种更高层次的抽象的类定义,用于

15、使用相同代码创建不同类模板的定义与函数模板的定义类似,只是把函数摸板中的函数定义部分换作类说明,并对类的成员函数进行定义即可。在类说明中可以使用出现在TYPE_LIST中的各个类型标识以及出现在ARG_LIST中的各变量。1template2class3,例如我们需要定义一个表示平面的点(Point)类,这个类有两个成员变量分别表示横坐标和纵坐标,并且这两个坐标的类型可以是int、float、double等等类型。因此可能写出类似Point_int_int、Point_float_int、Point_float_float等这样的类。通过类模板,我们只需要写一个类。1#include2usin

16、gnamespacestd;34template5classPoint_T67public:8T1a;/成员a为T1类型9T2b;/成员b为T2类型10Point_T():a(0),b(0)/默认构造函数11Point_T(T1ta,T2tb):a(ta),b(tb)/带参数的构造函数12Point_T&operator=(Point_T&pt);/赋值函数13friendPoint_Toperator+(Point_T&pt1,Point_T&pt2);/重载+14;1516template17Point_T&Point_T:operator=(Point_T&pt)/赋值函数1819thi

17、s-a=pt.a;20this-b=pt.b;21return*this;222324template25Point_Toperator+(Point_T&pt1,Point_T&pt2)/重载+2627Point_Ttemp;28temp.a=pt1.a+pt2.a;/结果对象中的a和b分别为两个参数对象的各自a和b之和29temp.b=pt1.b+pt2.b;30returntemp;313233template34ostream&operator(ostream&out,Point_T&pt)/重载输出流操作符3536out(pt.a,;/输出(a,b)37outpt.b);38retu

18、rnout;394041intmain()4243Point_TintPt1(1,2);/T1和T2都是int44Point_TintPt2(3,4);/T1和T2都是int45Point_TfloatPt1(1.1f,2.2f);/T1和T2都是float46Point_TfloatPt2(3.3f,4.4f);/T1和T2都是float4748Point_TintTotalPt;49Point_TfloatTotalPt;5051intTotalPt=intPt1+intPt2;/类型为Point_T的对象相加52floatTotalPt=floatPt1+floatPt2;/类型为Poi

19、nt_T的对象相加5354coutintTotalPtendl;/输出Point_T的对象55coutfloatTotalPtendl;/输出Point_T的对象5657return0;58Point_T类就是一个类模板,它的成员a和b分别为T1和T2类型,这里我们还实现了它的构造函数、赋值函数、“+”运算符的重载以及输出流操作符“”的重载。使用Point_T类非常方便,我们可以进行各种类型的组合。代码43、44行,定义了两个Point_T类的对象intPt1和intPt2,表明这两个对象的成员a和b都是int类型。代码45、46行,定义了两个Point_T类的对象floatPt1和float

20、Pt2,表明这两个对象的成员a和b都是float类型。代码51行,对intPt1和intPt2进行对象加法,结果保存到intTotalPt中,此过程先调用“+”函数,再调用了“=”函数。代码52行,与51行类似,只是相加的对象和结果对象都是Point_T类的对象。代码54、55行,输出对象intTotalPt和floatTotalPt的内容。可以看出,通过使用类模板Point_T我们可以创建不同的类,大大提高了代码的可维护性以及可重用性。有一些概念需要区别:函数模板与模板函数,类模板和模板类是不同的意思。函数模板的重点是模板,它表示的是一个模板,用来生产函数。例如前面例题的max是一个函数模板

21、。而模板函数的重点是函数,它表示的是由一个模板生成而来的函数。例如max,max等都是模板函数。类模板和模板类的区别与上面的类似,类模板用于生产类,例如Point_T就是一个类模板。而模板类是由一个模板生成而来的类,例如Point_T和Point_T都是模板类。(2)函数模板和类模板有什么区别。在面试例题1的程序代码中,我们在使用函数模板max时不一定要必须指明T的类型,函数模板max的实例化是由编译程序在处理函数调用时自动完成的,当调用max(1,2)时自动生成实例max,而调用max(1.1f,2.2f)时自动生成实例max。当然也可以显示指定T的类型。对于本例题的类模板Point_T来说

22、,其实例化必须被显示地指定,比如Point_T、Point_T。答案:函数模板是一种抽象函数定义,它代表一类同构函数。类模板是一种更高层次的抽象的类定义。函数模板的实例化是由编译程序在处理函数调用时自动完成的,而类模板的实例化必须由程序员在程序中显式地指定。9约瑟夫问题的解答考点:循环链表的操作出现频率:编号为1,2,.,N的N个人按顺时针方向围坐一圈,每人持有一个密码(正整数),一开始任选一个正整数作为报数上限值M,从第一个人开始按顺时针方向自1开始顺序报数,报到M时停止报数。报M的人出列,将他的密码作为新的M值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止

23、。试设计一个程序求出出列顺序。解析:显然当有人退出圆圈后,报数的工作要从下一个人开始继续,而剩下的人仍然是围成一个圆圈的,因此可以使用循环单链表,由于退出圆圈的工作对应着表中结点的删除操作,对于这种删除操作频繁的情况,选用效率较高的链表结构,为了程序指针每一次都指向一个具体的代表一个人的结点而不需要判断,链表不带头结点。所以,对于所有人围成的圆圈所对应的数据结构采用一个不带头结点的循环链表来描述。设头指针为p,并根据具体情况移动。为了记录退出的人的先后顺序,采用一个顺序表进行存储。程序结束后再输出依次退出的人的编号顺序。由于只记录各个结点的data值就可以,所以定义一个整型一维数组。如:int

24、quitn;n为一个根据实际问题定义的一个足够大的整数。程序代码如下:1#include2usingnamespacestd;34/*结构体和函数声明*/5typedefstructnode67intdata;8node*next;9node;1011node*node_create(intn);1213/构造节点数量为n的单向循环链表14node*node_create(intn)1516node*pRet=NULL;1718if(0!=n)1920intn_idx=1;21node*p_node=NULL;2223/*构造n个node*/24p_node=newnoden;25if(NUL

25、L=p_node)/申请内存失败,返回NULL2627returnNULL;2829else3031memset(p_node,0,n*sizeof(node);/初始化内存3233pRet=p_node;34while(n_idxdata=n_idx;37p_node-next=p_node+1;38p_node=p_node-next;39n_idx+;4041p_node-data=n;42p_node-next=pRet;434445returnpRet;464748intmain()4950node*pList=NULL;51node*pIter=NULL;52intn=20;53i

26、ntm=6;5455/*构造单向循环链表*/56pList=node_create(n);5758/*Josephus循环取数*/59pIter=pList;60m%=n;61while(pIter!=pIter-next)6263inti=1;6465/*取到第m-1个节点*/66for(;inext;697071/*输出第m个节点的值*/72printf(%d,pIter-next-data);7374/*从链表中删除第m个节点*/75pIter-next=pIter-next-next;76pIter=pIter-next;7778printf(%d,pIter-data);7980/*释放申请的空间*/81deletepList;82return0;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1