CC++语言程序设计笔试面试题30.docx
- 文档编号:9201751
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:16
- 大小:19.12KB
CC++语言程序设计笔试面试题30.docx
《CC++语言程序设计笔试面试题30.docx》由会员分享,可在线阅读,更多相关《CC++语言程序设计笔试面试题30.docx(16页珍藏版)》请在冰豆网上搜索。
CC++语言程序设计笔试面试题30
华为面试题:
怎么判断链表中是否有环?
boolCircleInList(Link*pHead)
{
if(pHead==NULL||pHead->next==NULL)//无节点或只有一个节点并且无自环
return(false);
if(pHead->next==pHead)//自环
return(true);
Link*pTemp1=pHead;//step1
Link*pTemp=pHead->next;//step2
while(pTemp!
=pTemp1&&pTemp!
=NULL&&pTemp->next!
=NULL)
{
pTemp1=pTemp1->next;
pTemp=pTemp->next->next;
}
if(pTemp==pTemp1)
return(true);
return(false);
}
两个字符串,s,t;把t字符串插入到s字符串中,s字符串有足够的空间存放t字符串
voidinsert(char*s,char*t,inti)
{
memcpy(&s[strlen(t)+i],&s[i],strlen(s)-i);
memcpy(&s[i],t,strlen(t));
s[strlen(s)+strlen(t)]='\0';
}
1。
编写一个C函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的。
char*search(char*cpSource,charch)
{
char*cpTemp=NULL,*cpDest=NULL;
intiTemp,iCount=0;
while(*cpSource)
{
if(*cpSource==ch)
{
iTemp=0;
cpTemp=cpSource;
while(*cpSource==ch)
++iTemp,++cpSource;
if(iTemp>iCount)
iCount=iTemp,cpDest=cpTemp;
if(!
*cpSource)
break;
}
++cpSource;
}
returncpDest;
}
2。
请编写一个C函数,该函数在给定的内存区域搜索给定的字符,并返回该字符所在位置索引值。
intsearch(char*cpSource,intn,charch)
{
inti;
for(i=0;i =ch;++i); returni; } 一个单向链表,不知道头节点,一个指针指向其中的一个节点,问如何删除这个指针指向的节点? 将这个指针指向的next节点值copy到本节点,将next指向next->next,并随后删除原next指向的节点。 #include voidfoo(intm,intn) { printf("m=%d,n=%d\n",m,n); } intmain() { intb=3; foo(b+=3,++b); printf("b=%d\n",b); return0; } 输出: m=7,n=4,b=7(VC6.0) 这种方式和编译器中得函数调用关系相关即先后入栈顺序。 不过不同 编译器得处理不同。 也是因为C标准中对这种方式说明为未定义,所以 各个编译器厂商都有自己得理解,所以最后产生得结果完全不同。 因为这样,所以遇见这种函数,我们首先要考虑我们得编译器会如何处理 这样得函数,其次看函数得调用方式,不同得调用方式,可能产生不同得 结果。 最后是看编译器优化。 2.写一函数,实现删除字符串str1中含有的字符串str2. 第二个就是利用一个KMP匹配算法找到str2然后删除(用链表实现的话,便捷于数组) /*雅虎笔试题(字符串操作) 给定字符串A和B,输出A和B中的最大公共子串。 比如A="aocdfe"B="pmcdfa"则输出"cdf" */ //Author: azhen #include #include #include char*commanstring(charshortstring[],charlongstring[]) { inti,j; char*substring=malloc(256); if(strstr(longstring,shortstring)! =NULL)//如果……,那么返回shortstring returnshortstring; for(i=strlen(shortstring)-1;i>0;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); else comman=commanstring(str1,str2); printf("thelongestcommanstringis: %s\n",comman); } 11.写一个函数比较两个字符串str1和str2的大小,若相等返回0,若str1大于 str2返回1,若str1小于str2返回-1 intstrcmp(constchar*src,constchar*dst) { intret=0; while(! (ret=*(unsignedchar*)src-*(unsignedchar*)dst)&&*dst) { ++src; ++dst; } if(ret<0) ret=-1; elseif(ret>0) 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; #include #defineNUM1000 intfind5(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"的最大子串为"cad" intGetCommon(char*s1,char*s2,char**r1,char**r2) { intlen1=strlen(s1); intlen2=strlen(s2); intmaxlen=0; for(inti=0;i { for(intj=0;j { if(s1[i]==s2[j]) { intas=i,bs=j,count=1; while(as+1 count++; if(count>maxlen) { 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;i<8;i++){ temp[i]=(char)(num<<4*i>>28); 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,打印: 123 894 765 N=4,打印: 1234 1213145 1116156 10987 解答: 1#defineN15 ints[N][N]; voidmain() { intk=0,i=0,j=0; inta=1; for(;k<(N+1)/2;k++) { while(j while(i while(j>k-1)s[i][j--]=a++;i--;j++; while(i>k)s[i--][j]=a++;i++;j++; } for(i=0;i { for(j=0;j cout< cout< } } 2defineMAX_N100 intmatrix[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;i matrix[y][i]=start++; for(j=y;j matrix[j][x+n-1]=start++; for(i=x+n-1;i>x;i--)//底部 matrix[y+n-1][i]=start++; for(j=y+n-1;j>y;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;i for(j=0;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----s3 100----s2 100----s1 所以结果应该是1 如果先申明的在低位则: 001----s1 100----s2 100----s3 结果是4 1、原题跟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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- CC 语言程序设计 笔试 试题 30