雅虎笔试题

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

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

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

资源描述

/*雅虎笔试题(字符串操作)给定字符串A和B,输出A和B中的最大公共子串。比如A=aocdfeB=pmcdfa则输出cdf*///Author:azhen#includestdio.h#includestdlib.h#includestring.hchar*commanstring(charshortstring[],charlongstring[]){inti,j;char*substring=malloc(256);if(strstr(longstring,shortstring)!=NULL)//如果……,那么返回shortstringreturnshortstring;for(i=strlen(shortstring)-1;i0;i--)//否则,开始循环计算{for(j=0;j=strlen(shortstring)-i;j++){memcpy(substring,&shortstring[j],i);substring[i]='\0';if(strstr(longstring,substring)!=NULL)returnsubstring;}}returnNULL;}main(){char*str1=malloc(256);char*str2=malloc(256);char*comman=NULL;gets(str1);gets(str2);if(strlen(str1)strlen(str2))//将短的字符串放前面comman=commanstring(str2,str1);elsecomman=commanstring(str1,str2);printf(thelongestcommanstringis:%s\n,comman);}11.写一个函数比较两个字符串str1和str2的大小,若相等返回0,若str1大于str2返回1,若str1小于str2返回-1intstrcmp(constchar*src,constchar*dst){intret=0;while(!(ret=*(unsignedchar*)src-*(unsignedchar*)dst)&&*dst){++src;++dst;}if(ret0)ret=-1;elseif(ret0)ret=1;return(ret);}3,求1000!的未尾有几个0(用素数相乘的方法来做,如72=2*2*2*3*3);求出1-1000里,能被5整除的数的个数n1,能被25整除的数的个数n2,能被125整除的数的个数n3,能被625整除的数的个数n4.1000!末尾的零的个数=n1+n2+n3+n4;#includestdio.h#defineNUM1000intfind5(intnum){intret=0;while(num%5==0){num/=5;ret++;}returnret;}intmain(){intresult=0;inti;for(i=5;i=NUM;i+=5){result+=find5(i);}printf(thetotalzeronumberis%d\n,result);return0;}1.有双向循环链表结点定义为:structnode{intdata;structnode*front,*next;};有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除BOOLDeteleNode(Node*pHeader,DataTypeValue){if(pHeader==NULL)return;BOOLbRet=FALSE;Node*pNode=pHead;while(pNode!=NULL){if(pNode-data==Value){if(pNode-front==NULL){pHeader=pNode-next;pHeader-front=NULL;}else{if(pNode-next!=NULL){pNode-next-front=pNode-front;}pNode-front-next=pNode-next;}Node*pNextNode=pNode-next;deletepNode;pNode=pNextNode;bRet=TRUE;//不要break或return,删除所有}else{pNode=pNode-next;}}returnbRet;}voidDE(Node*pHeadA,Node*pHeadB){if(pHeadA==NULL||pHeadB==NULL){return;}Node*pNode=pHeadA;while(pNode!=NULL){if(DeteleNode(pHeadB,pNode-data)){if(pNode-front==NULL){pHeadA=pNode-next;pHeadA-front=NULL;}else{pNode-front-next=pNode-next;if(pNode-next!=NULL){pNode-next-front=pNode-front;}}Node*pNextNode=pNode-next;deletepNode;pNode=pNextNode;}else{pNode=pNode-next;}}}2.编程实现:找出两个字符串中最大公共子字符串,如abccade,dgcadde的最大子串为cadintGetCommon(char*s1,char*s2,char**r1,char**r2){intlen1=strlen(s1);intlen2=strlen(s2);intmaxlen=0;for(inti=0;ilen1;i++){for(intj=0;jlen2;j++){if(s1[i]==s2[j]){intas=i,bs=j,count=1;while(as+1len1&&bs+1len2&&s1[++as]==s2[++bs])count++;if(countmaxlen){maxlen=count;*r1=s1+i;*r2=s2+j;}}}}3.编程实现:把十进制数(long型)分别以二进制和十六进制形式输出,不能使用printf系列库函数char*test3(longnum){char*buffer=(char*)malloc(11);buffer[0]='0';buffer[1]='x';buffer[10]='\0';char*temp=buffer+2;for(inti=0;i8;i++){temp[i]=(char)(num4*i28);temp[i]=temp[i]=0?temp[i]:temp[i]+16;temp[i]=temp[i]10?temp[i]+48:temp[i]+55;}returnbuffer;}输入N,打印N*N矩阵比如N=3,打印:123894765N=4,打印:12341213145111615610987解答:1#defineN15ints[N][N];voidmain(){intk=0,i=0,j=0;inta=1;for(;k(N+1)/2;k++){while(jN-k)s[i][j++]=a++;i++;j--;while(iN-k)s[i++][j]=a++;i--;j--;while(jk-1)s[i][j--]=a++;i--;j++;while(ik)s[i--][j]=a++;i++;j++;}for(i=0;iN;i++){for(j=0;jN;j++)couts[i][j]'\t';coutendl;}}2defineMAX_N100intmatrix[MAX_N][MAX_N];/**(x,y):第一个元素的坐标*start:第一个元素的值*n:矩阵的大小*/voidSetMatrix(intx,inty,intstart,intn){inti,j;if(n=0)//递归结束条件return;if(n==1){//矩阵大小为1时matrix[x][y]=start;return;}for(i=x;ix+n-1;i++)//矩阵上部matrix[y][i]=start++;for(j=y;jy+n-1;j++)//右部matrix[j][x+n-1]=start++;for(i=x+n-1;ix;i--)//底部matrix[y+n-1][i]=start++;for(j=y+n-1;jy;j--)//左部matrix[j][x]=start++;SetMatrix(x+1,y+1,start,n-2);//递归}voidmain(){inti,j;intn;scanf(%d,&n);SetMatrix(0,0,1,n);//打印螺旋矩阵for(i=0;in;i++){for(j=0;jn;j++)printf(%4d,matrix[i][j]);printf(\n);}}斐波拉契数列递归实现的方法如下:intFunct(intn){if(n==0)return1;if(n==1)return1;retrurnFunct(n-1)+Funct(n-2);}请问,如何不使用递归,来实现上述函数?请教各位高手!解答:intFunct(intn)//n为非负整数{inta=0;intb=1;intc;if(n==0)c=1;elseif(n==1)c=1;elsefor(inti=2;i=n;i++)//应该n从2开始算起{c=a+b;a=b;b=c;}returnc;}解答:现在大多数系统都是将低字位放在前面,而结构体中位域的申明一般是先声明高位。100的二进制是001100100低位在前高位在后001----s3100----s2100----s1所以结果应该是1如果先申明的在低位则:001----s1100----s2100----s3结果是41、原题跟little-endian,big-endian没有关系2、原题跟位域的存储空间分配有关,到底是从低字节分配还是从高字节分配,从DevC++和VC7.1上看,都是从低字节开始分配,并且连续分配,中间不空,不像谭的书那样会留空位3、原题跟编译器有关,编译器在未用堆栈空间的默认值分配上有所不同,DevC++未用空间分配为01110111b,VC7.1下为11001100b,所以在DevC++下的结果为5,在VC7.1下为1。注:PC一般采用little-endian,即高高低低,但在网络传输上,一般采用big-endian,即高低低高,华为是做网络的,所以可能考虑big-endian模式,这样输出结果可能为4判断一个字符串是不是回文intIsReverseStr(char*aStr){inti,j;intfound=1;if(aStr==NULL)return-1;j=strlen(aStr);for(i=0;ij/2;i++)if(*(aStr+i)!=*(aStr+j-i-1)){found=0;break;}returnfound;}Josephu问题为:设编号为1,2,…n的n个人围坐一圈,约定编号为k(1=k=n)的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。数组实现:#includestdio.h#includemalloc.hintJosephu(intn,intm){intflag,i,j=0;int*arr=(int*)malloc(n*sizeof(int));for(i=0;in;++i)arr[i]=1;for(i=1;in;++i){flag=0;while(flagm){if(j==n)j=0;if(arr[j])++flag;++j;}arr[j-1]=0;printf(第

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

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

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

×
保存成功