华为C语言面试题Word文档格式.docx
- 文档编号:19423438
- 上传时间:2023-01-06
- 格式:DOCX
- 页数:22
- 大小:535.16KB
华为C语言面试题Word文档格式.docx
《华为C语言面试题Word文档格式.docx》由会员分享,可在线阅读,更多相关《华为C语言面试题Word文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
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;
ireturni;
一个单向链表,不知道头节点,一个指针指向其中的一个节点,问如何删除这个指针指向的节点?
将这个指针指向的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);
b=%d\n"
b);
return0;
输出:
m=7,n=4,b=7(VC6.0)
这种方式和编译器中得函数调用关系相关即先后入栈顺序。
不过不同
编译器得处理不同。
也是因为C标准中对这种方式说明为未定义,所以
各个编译器厂商都有自己得理解,所以最后产生得结果完全不同。
因为这样,所以遇见这种函数,我们首先要考虑我们得编译器会如何处理
这样得函数,其次看函数得调用方式,不同得调用方式,可能产生不同得
结果。
最后是看编译器优化。
2.写一函数,实现删除字符串str1中含有的字符串str2.
第二个就是利用一个KMP匹配算法找到str2然后删除(用链表实现的话,便捷于数组)
//Author:
azhen
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]='
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);
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>
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;
#defineNUM1000
intfind5(intnum){
intret=0;
while(num%5==0){
num/=5;
ret++;
returnret;
intmain(){
intresult=0;
for(i=5;
i<
=NUM;
i+=5)
result+=find5(i);
thetotalzeronumberis%d\n"
result);
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!
if(pNode->
data==Value)
front==NULL)
pHeader=pNode->
pHeader->
front=NULL;
pNode->
front=pNode->
front;
front->
next=pNode->
Node*pNextNode=pNode->
deletepNode;
pNode=pNextNode;
bRet=TRUE;
//不要break或return,删除所有
pNode=pNode->
returnbRet;
voidDE(Node*pHeadA,Node*pHeadB)
if(pHeadA==NULL||pHeadB==NULL)
return;
Node*pNode=pHeadA;
if(DeteleNode(pHeadB,pNode->
data))
pHeadA=pNode->
pHeadA->
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<
len1;
i++)
for(intj=0;
j<
len2;
j++)
if(s1[i]==s2[j])
intas=i,bs=j,count=1;
while(as+1<
len1&
bs+1<
len2&
s1[++as]==s2[++bs])
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]='
char*temp=buffer+2;
for(inti=0;
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<
N-k)s[i][j++]=a++;
i++;
j--;
while(i<
N-k)s[i++][j]=a++;
i--;
while(j>
k-1)s[i][j--]=a++;
j++;
while(i>
k)s[i--][j]=a++;
for(i=0;
N;
i++)
for(j=0;
j++)
cout<
s[i][j]<
'
\t'
endl;
2defineMAX_N100
intmatrix[MAX_N][MAX_N];
voidSetMatrix(intx,inty,intstart,intn){
if(n<
=0)//递归结束条件
if(n==1){//矩阵大小为1时
matrix[x][y]=start;
for(i=x;
x+n-1;
i++)//矩阵上部
matrix[y][i]=start++;
for(j=y;
y+n-1;
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(){
intn;
scanf("
%d"
&
n);
SetMatrix(0,0,1,n);
//打印螺旋矩阵
for(i=0;
n;
for(j=0;
M"
matrix[i][j]);
\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;
=n;
i++)//应该n从2开始算起
c=a+b;
a=b;
b=c;
returnc;
现在大多数系统都是将低字位放在前面,而结构体中位域的申明一般是先声明高位。
100的二进制是001100100
低位在前高位在后
001----s3
100----s2
100----s1
所以结果应该是1
如果先申明的在低位则:
001----s1
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
判断一个字符串是不是回文
intIsReverseStr(char*aStr)
inti,j;
intfound=1;
if(aStr==NULL)
return-1;
j=strlen(aStr);
iif(*(aStr+i)!
=*(aStr+j-i-1))
found=0;
returnfound;
Josephu问题为:
设编号为1,2,…n的n个人围坐一圈,约定编号为k(1<
=k<
=n)的人从1开始报数,数到m的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。
数组实现:
intJosephu(intn,intm)
intflag,i,j=0;
int*arr=(int*)malloc(n*sizeof(int));
for(i=0;
++i)
arr[i]=1;
for(i=1;
flag=0;
while(flag<
m)
if(j==n)
j=0;
if(arr[j])
++flag;
++j;
arr[j-1]=0;
第M个出局的人是:
M号\n"
i,j);
free(arr);
returnj;
intn,m;
%d%d"
n,&
m);
最后胜利的是%d号!
Josephu(n,m));
system("
pause"
链表实现:
typedefstructNode
intindex;
structNode*next;
}JosephuNode;
JosephuNode*head,*tail;
head=tail=(JosephuNode*)malloc(sizeof(JosephuNode));
tail->
index=i;
next=(JosephuNode*)malloc(sizeof(JosephuNode));
tail=tail->
next=head;
tail!
=head;
for(j=1;
m;
++j)
tail=head;
head=head->
next=head->
i,head->
index);
free(head);
head=tail->
i=head->
index;
returni;
已知strcpy函数的原型是:
char*strcpy(char*strDest,constchar*strSrc);
1.不调用库函数,实现strcpy函数。
2.解释为什么要返回char*。
解说:
1.strcpy的实现代码
char*strcpy(char*strDest,constchar*strSrc)
if((strDest==NULL)||(strSrc==NULL))file:
//[/1]
throw"
Invalid
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华为 语言 试题