微软等数据结构算法面试100题[第21-40题答案]

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

1精选微软等公司数据结构精选微软等公司数据结构精选微软等公司数据结构精选微软等公司数据结构++++算法面试算法面试算法面试算法面试100100100100题题题题----------------答案答案答案答案((((第第第第21-40题题题题))))V0.3版版版版作者前言:作者前言:作者前言:作者前言:1.首先恭喜你,你确实得到了一份不错的资源。送给你一句话,饮水当思源。2.本来可以把这份第21-40的答案弄成word形式的,那样的话,大家可以直接复制黏贴其中的源码,直接上机验证。//虽然其中大部分源码,我已经编译调试了,能保证基本的精准。3.但我实在实在无法忍受大量大量的人,随意任意转载,却不注明作者本人我和出处,有的甚至私自据为己有。所以..见谅。还是这句话,展示自己的思考结果,是一种骄傲。其它资源,下载地址:[第1题-60题汇总]微软等数据结构+算法面试100题[答案V0.2版]精选微软数据结构+算法面试100题[前20题]//修正此份答案是针对最初的V0.1版本,进行的校正与修正。[答案V0.1版]精选微软数据结构+算法面试100题[前25题][第二部分]精选微软等公司结构+算法面试100题[前41-60题]:[第一部分]精选微软等公司数据结构+算法经典面试100题[1-40题]更多资源,下载地址:若你对以下答案,有任何问题,欢迎联系我:MyE-mail:zhoulei0907@yahoo.cn或者,直接回复于此帖上:[推荐][整理]算法面试:精选微软经典的算法面试100题[前40-60题]、2010年11月14日,晚,于东华理工。2第21212121题2010年中兴面试题编程求解:输入两个整数n和m,从数列1,2,3.......n中随意取几个数,使其和等于m,要求将其中所有的可能组合列出来.//此题与第14题差不多,再次不做过多解释。//July、2010/10/22。#includeiostream#includelistusingnamespacestd;voidqiujie(intsum,intn){staticlistintilist;if(n1||sum1)return;if(sumn){ilist.push_front(n);qiujie(sum-n,n-1);ilist.pop_front();qiujie(sum,n-1);}else{coutsum;for(listint::iteratorit=ilist.begin();it!=ilist.end();++it)cout*it;coutendl;}}intmain(){intm,n;cout请输入你要等于多少的数值m:endl;cinm;cout请输入你要从1.....n数列中取值的n:endl;cinn;qiujie(m,n);return0;}3///////////////////////////////////////////请输入你要等于多少的数值m:10请输入你要从1.....n数列中取值的n:82837461452351234Pressanykeytocontinue///////////////////////////////////////第22222222题:有4张红色的牌和4张蓝色的牌,主持人先拿任意两张,再分别在A、B、C三人额头上贴任意两张牌,A、B、C三人都可以看见其余两人额头上的牌,看完后让他们猜自己额头上是什么颜色的牌,A说不知道,B说不知道,C说不知道,然后A说知道了。请教如何推理,A是怎么知道的。如果用程序,又怎么实现呢?//July、2010/10/22//今是老妈生日,祝福老妈,生日快乐。!:).4张r4张b有以下3种组合:rrbbrb1.B,C全是一种颜色BCAbb.rrbb.rr2.BCAbbrrbb/RR/BR,=A:BRrrbb=A:BR43.BCABRBBRR/BR,=A:BR//推出A:BR的原因,//如果A是RR,//那么,当ABC都说不知道后,B最后应该知道自己是BR了。//因为B不可能是RR或BB。4.BCABRBRBB/RR/BR//推出A:BR的原因//如果,A是BB,那么B=BR/RR,//如果B=RR,那么一开始,C就该知道自己是BR了。//如果B=BR,//最后,也还是推出=A:BR//至于程序,暂等高人。第23232323题:用最简单,最快速的方法计算出下面这个圆形是否和正方形相交。3D坐标系原点(0.0,0.0,0.0)圆形:半径r=3.0圆心o=(*.*,0.0,*.*)正方形:4个角坐标;1:(*.*,0.0,*.*)2:(*.*,0.0,*.*)3:(*.*,0.0,*.*)4:(*.*,0.0,*.*)*/参考:第24242424题:1.反转链表2.合并链表。pPrev-pNode-pNextListNode*ReverseIteratively(ListNode*pHead){ListNode*pReversedHead=NULL;ListNode*pNode=pHead;ListNode*pPrev=NULL;while(pNode!=NULL)//pNode=m{ListNode*pNext=pNode-m_pNext;//n保存在pNext下//如果pNext指为空,则当前结点pNode设为头。if(pNext==NULL)pReversedHead=pNode;//reversethelinkagebetweennodespNode-m_pNext=pPrev;//moveforwardonthethelistpPrev=pNode;pNode=pNext;}returnpReversedHead;}或者,这样写:head-next-p-qtemplateclassTNodeT*Reverse(NodeT*head){p=head-next;while(p){q=p-next;//p-next先保存在q下p-next=head-next;//p掉头指向head-nexthead-next=p;//p赋给head-nextp=q;//q赋给p。//上俩行即,指针前移嘛...}returnhead;6第25252525题:写一个函数,它的原形是intcontinumax(char*outputstr,char*intputstr)功能:在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串付给其中一个函数参数outputstr所指内存。例如:abcd12345ed125ss123456789的首地址传给intputstr后,函数将返回9,outputstr所指的值为123456789//leeyunce这个相对比较简单,思路不用多说,跟在序列中求最小值差不多。未经测试。有错误欢迎指出。intcontinumax(char*outputstr,char*intputstr){inti,maxlen=0;char*maxstr=0;while(true){while(intputstr&&(*intputstr'0'||*intputstr'9'))//skipallnon-digitcharacters{intputstr++;}if(!intputstr)break;intcount=0;char*tempstr=intputstr;while(intputstr&&(*intputstr='0'&&*intputstr='9'))//OK,thesecharactersaredigits{count++;intputstr++;}if(countmaxlen){maxlen=count;maxstr=tempstr;}}for(i=0;imaxlen;i++){outputstr[i]=maxstr[i];7}outputstr[i]=0;returnmaxlen;}26.26.26.26.左旋转字符串题目:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串abcdef左旋转2位得到字符串cdefab。请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。分析:如果不考虑时间和空间复杂度的限制,最简单的方法莫过于把这道题看成是把字符串分成前后两部分,通过旋转操作把这两个部分交换位置。于是我们可以新开辟一块长度为n+1的辅助空间,把原字符串后半部分拷贝到新空间的前半部分,在把原字符串的前半部分拷贝到新空间的后半部分。不难看出,这种思路的时间复杂度是O(n),需要的辅助空间也是O(n)。把字符串看成有两段组成的,记位XY。左旋转相当于要把字符串XY变成YX。我们先在字符串上定义一种翻转的操作,就是翻转字符串中字符的先后顺序。把X翻转后记为XT。显然有(XT)T=X。我们首先对X和Y两段分别进行翻转操作,这样就能得到XTYT。接着再对XTYT进行翻转操作,得到(XTYT)T=(YT)T(XT)T=YX。正好是我们期待的结果。分析到这里我们再回到原来的题目。我们要做的仅仅是把字符串分成两段,第一段为前面m个字符,其余的字符分到第二段。再定义一个翻转字符串的函数,按照前面的步骤翻转三次就行了。时间复杂度和空间复杂度都合乎要求。#includestring.h//Movethefirstncharsinastringtoitsendchar*LeftRotateString(char*pStr,unsignedintn){if(pStr!=NULL){intnLength=static_castint(strlen(pStr));8if(nLength0||n==0||nnLength){char*pFirstStart=pStr;char*pFirstEnd=pStr+n-1;char*pSecondStart=pStr+n;char*pSecondEnd=pStr+nLength-1;//reversethefirstpartofthestringReverseString(pFirstStart,pFirstEnd);//reversethesecondpartofthestrintReverseString(pSecondStart,pSecondEnd);//reversethewholestringReverseString(pFirstStart,pSecondEnd);}}returnpStr;}//ReversethestringbetweenpStartandpEndvoidReverseString(char*pStart,char*pEnd){if(pStart==NULL||pEnd==NULL){while(pStart=pEnd){chartemp=*pStart;*pStart=*pEnd;*pEnd=temp;pStart++;pEnd--;}}}927.27.27.27.跳台阶问题题目:一

1 / 44
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功