欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    华为C语言面试题.doc

    • 资源ID:43263306       资源大小:546.50KB        全文页数:5页
    • 资源格式: DOC        下载积分:6金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要6金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    华为C语言面试题.doc

    华为C语言经典面试题。每道题都附有详细解答和讲解。怎么判断链表中是否有环?bool CircleInList(Link* pHead)if(pHead = = NULL | pHead->next = = NULL)/无节点或只有一个节点并且无自环return (false);if(pHead->next = = pHead)/自环return (true);Link *pTemp1 = pHead;/step 1Link *pTemp = pHead->next;/step 2while(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字符串void insert(char *s, char *t, int i)memcpy(&sstrlen(t)+i,&si,strlen(s)-i);memcpy(&si,t,strlen(t);sstrlen(s)+strlen(t)='0'1。编写一个 C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的。char * search(char *cpSource, char ch)char *cpTemp=NULL, *cpDest=NULL;int iTemp, 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;return cpDest;2。请编写一个 C 函数,该函数在给定的存区域搜索给定的字符,并返回该字符所在位置索引值。int search(char *cpSource, int n, char ch)int i;for(i=0; ireturn i;一个单向链表,不知道头节点,一个指针指向其中的一个节点,问如何删除这个指针指向的节点?将这个指针指向的next节点值copy到本节点,将next指向next->next,并随后删除原next指向的节点。#includevoid foo(int m, int n)printf("m=%d, n=%dn", m, n);int main()int b = 3;foo(b+=3, +b);printf("b=%dn", b);return 0;输出:m=7,n=4,b=7(VC6.0)这种方式和编译器中得函数调用关系相关即先后入栈顺序。不过不同编译器得处理不同。也是因为C标准中对这种方式说明为未定义,所以各个编译器厂商都有自己得理解,所以最后产生得结果完全不同。因为这样,所以遇见这种函数,我们首先要考虑我们得编译器会如何处理这样得函数,其次看函数得调用方式,不同得调用方式,可能产生不同得结果。最后是看编译器优化。2.写一函数,实现删除字符串str1中含有的字符串str2.第二个就是利用一个KMP匹配算法找到str2然后删除(用链表实现的话,便捷于数组)/Author: azhen#include#include#includechar *commanstring(char shortstring, char longstring)int i, j;char *substring=malloc(256);if(strstr(longstring, shortstring)!=NULL) /如果,那么返回shortstringreturn shortstring;for(i=strlen(shortstring)-1;i>0; i-) /否则,开始循环计算for(j=0; j<=strlen(shortstring)-i; j+)memcpy(substring, &shortstringj, i);substringi='0'if(strstr(longstring, substring)!=NULL)return substring;return NULL;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("the longest comman string is: %sn", comman);11.写一个函数比较两个字符串str1和str2的大小,若相等返回0,若str1大于str2返回1,若str1小于str2返回1int strcmp ( const char * src,const char * dst)int ret = 0 ;while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)+src;+dst;if ( ret < 0 )ret = -1 ;else if ( 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#define NUM 1000int find5(int num)int ret=0;while(num%5=0)num/=5;ret+;return ret;int main()int result=0;int i;for(i=5;i<=NUM;i+=5)result+=find5(i);printf(" the total zero number is %dn",result);return 0;1. 有双向循环链表结点定义为:struct node int data;struct node *front,*next;有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除BOOL DeteleNode(Node *pHeader, DataType Value)if (pHeader = NULL) return;BOOL bRet = FALSE;Node *pNode = pHead;while (pNode != NULL)if (pNode->data = Value)if (pNode->front = NULL)pHeader = pNode->next;pHeader->front = NULL;elseif (pNode->next != NULL)pNode->next->front = pNode->front;pNode->front->next = pNode->next;Node *pNextNode = pNode->next;delete pNode;pNode = pNextNode;bRet = TRUE;/不要break或return, 删除所有elsepNode = pNode->next;return bRet;void DE(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;elsepNode->front->next = pNode->next;if (pNode->next != NULL)pNode->next->front = pNode->front;Node *pNextNode = pNode->next;delete pNode;pNode = pNextNode;elsepNode = pNode->next;2. 编程实现:找出两个字符串中最大公共子字符串,如"abccade","dgcadde"的最大子串为"cad"int GetCommon(char *s1, char *s2, char *r1, char *r2)int len1 = strlen(s1);int len2 = strlen(s2);int maxlen = 0;for(int i = 0; i < len1; i+)for(int j = 0; j < len2; j+)if(s1i = s2j)int as = 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(long num) char* buffer = (char*)malloc(11);buffer0 = '0'buffer1 = 'x'buffer10 = '0'char* temp = buffer + 2;for (int i=0; i < 8; i+) tempi = (char)(num<<4*i>>28);tempi = tempi >= 0 ? tempi : tempi + 16;tempi = tempi < 10 ? tempi + 48 : tempi + 55;return buffer;输入N, 打印 N*N 矩阵比如 N = 3,打印:1 2 38 9 47 6 5N = 4,打印:1 2 3 412 13 14 511 16 15 610 9 8 7解答:1 #define N 15int sNN;void main()int k = 0, i = 0, j = 0;int a = 1;for( ; k < (N+1)/2; k+ )while( j < N-k ) sij+ = a+; i+; j-;while( i < N-k ) si+j = a+; i-; j-;while( j > k-1 ) sij- = a+; i-; j+;while( i > k ) si-j = a+; i+; j+;for( i = 0; i < N; i+ )for( j = 0; j < N; j+ )cout << sij << 't'cout << endl;2 define MAX_N 100int matrixMAX_NMAX_N;void SetMatrix(int x, int y, int start, int n) int i, j;if (n <= 0) /递归完毕条件return;if (n = 1) /矩阵大小为1时matrixxy = start;return;for (i = x; i < x + n-1; i+) /矩阵上部matrixyi = start+;for (j = y; j < y + n-1; j+) /右部matrixjx+n-1 = start+;for (i = x+n-1; i > x; i-) /底部matrixy+n-1i = start+;for (j = y+n-1; j > y; j-) /左部matrixjx = start+;SetMatrix(x+1, y+1, start, n-2); /递归void main() int i, j;int n;scanf("%d", &n);SetMatrix(0, 0, 1, n);/打印螺旋矩阵for(i = 0; i < n; i+) for (j = 0; j < n; j+)printf("M", matrixij);printf("n");斐波拉契数列递归实现的方法如下:int Funct( int n )if(n=0) return 1;if(n=1) return 1;retrurn Funct(n-1) + Funct(n-2);请问,如何不使用递归,来实现上述函数?请教各位高手!解答:int Funct( int n ) / n 为非负整数int a=0;int b=1;int c;if(n=0) c=1;else if(n=1) c=1;else for(int i=2;i<=n;i+) /应该n从2开始算起c=a+b;a=b;b=c;return c;解答:现在大多数系统都是将低字位放在前面,而结构体中位域的申明一般是先声明高位。100 的二进制是 001 100 100低位在前 高位在后001-s3100-s2100-s1所以结果应该是 1如果先申明的在低位则:001-s1100-s2100-s3结果是 41、原题跟little-endian,big-endian没有关系2、原题跟位域的存储空间分配有关,到底是从低字节分配还是从高字节分配,从Dev C+和VC7.1上看,都是从低字节开始分配,并且连续分配,中间不空,不像谭的书那样会留空位3、原题跟编译器有关,编译器在未用堆栈空间的默认值分配上有所不同,Dev C+未用空间分配为01110111b,VC7.1下为11001100b,所以在Dev C+下的结果为5,在VC7.1下为1。注:PC一般采用little-endian,即高高低低,但在网络传输上,一般采用big-endian,即高低低高,华为是做网络的,所以可能考虑big-endian模式,这样输出结果可能为4判断一个字符串是不是回文int IsReverseStr(char *aStr)int i,j;int found=1;if(aStr=NULL)return -1;j=strlen(aStr);for(i=0;iif(*(aStr+i)!=*(aStr+j-i-1)found=0;break;return found;Josephu 问题为:设编号为1,2, n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。数组实现:#include#includeint Josephu(int n, int m)int flag, i, j = 0;int *arr = (int *)malloc(n * sizeof(int);for (i = 0; i < n; +i)arri = 1;for (i = 1; i < n; +i)flag = 0;while (flag < m)if (j = n)j = 0;if (arrj)+flag;+j;arrj - 1 = 0;printf("第M个出局的人是:M号n", i, j);free(arr);return j;int main()int n, m;scanf("%d%d", &n, &m);printf("最后胜利的是%d号!n", Josephu(n, m);system("pause");return 0;链表实现:#include#includetypedef struct Nodeint index;struct Node *next;JosephuNode;int Josephu(int n, int m)int i, j;JosephuNode *head, *tail;head = tail = (JosephuNode *)malloc(sizeof(JosephuNode);for (i = 1; i < n; +i)tail->index = i;tail->next = (JosephuNode *)malloc(sizeof(JosephuNode);tail = tail->next;tail->index = i;tail->next = head;for (i = 1; tail != head; +i)for (j = 1; j < m; +j)tail = head;head = head->next;tail->next = head->next;printf("第M个出局的人是:M号n", i, head->index);free(head);head = tail->next;i = head->index;free(head);return i;int main()int n, m;scanf("%d%d", &n, &m);printf("最后胜利的是%d号!n", Josephu(n, m);system("pause");return 0;已知strcpy函数的原型是:char * strcpy(char * strDest,const char * strSrc);1.不调用库函数,实现strcpy函数。2.解释为什么要返回char *。解说:1.strcpy的实现代码char * strcpy(char * strDest,const char * strSrc)if (strDest=NULL)|(strSrc=NULL) file:/1throw "Invalid argument(s)" /2char * strDestCopy=strDest; file:/3while (*strDest+=*strSrc+)!='0'); file:/4return strDestCopy;错误的做法:1(A)不检查指针的有效性,说明答题者不注重代码的健壮性。(B) 检查指针的有效性时使用(!strDest)|(!strSrc)或(!(strDest&&strSrc),说明答题者对C语言中类型的隐式转换没有深刻认识。在本例中char *转换为bool即是类型隐式转换,这种功能虽然灵活,但更多的是导致出错概率增大和维护成本升高。所以C+专门增加了bool、true、false 三个关键字以提供更安全的条件表达式。(C)检查指针的有效性时使用(strDest=0)|(strSrc=0),说明答题者不知道使用常量的好处。直接使用字面常量(如本例中的0)会减少程序的可维护性。0虽然简单,但程序中可能出现很多处对指针的检查,万一出现笔误,编译器不能发现,生成的程序含逻辑错误,很难排除。而使用NULL代替0,如果出现拼写错误,编译器就会检查出来。2(A)return new string("Invalid argument(s)");,说明答题者根本不知道返回值的用途,并且他对存泄漏也没有警惕心。从函数中返回函数体分配的存是十分危险的做法,他把释放存的义务抛给不知情的调用者,绝大多数情况下,调用者不会释放存,这导致存泄漏。(B)return 0;,说明答题者没有掌握异常机制。调用者有可能忘记检查返回值,调用者还可能无法检查返回值(见后面的链式表达式)。妄想让返回值肩负返回正确值和异常值的双重功能,其结果往往是两种功能都失效。应该以抛出异常来代替返回值,这样可以减轻调用者的负担、使错误不会被忽略、增强程序的可维护性。3(A)忘记保存原始的strDest值,说明答题者逻辑思维不严密。4(A)循环写成while (*strDest+=*strSrc+);,同1(B)。(B)循环写成while (*strSrc!='0') *strDest+=*strSrc+;,说明答题者对边界条件的检查不力。循环体完毕后,strDest字符串的末尾没有正确地加上'0'。5 / 5

    注意事项

    本文(华为C语言面试题.doc)为本站会员(知****量)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开