综合01华为机考题目.docx
- 文档编号:23678617
- 上传时间:2023-05-19
- 格式:DOCX
- 页数:48
- 大小:30.28KB
综合01华为机考题目.docx
《综合01华为机考题目.docx》由会员分享,可在线阅读,更多相关《综合01华为机考题目.docx(48页珍藏版)》请在冰豆网上搜索。
综合01华为机考题目
2012华为校园招聘机考试题总结(厦门大学)
1、删除子串
删除子串只要是原串中有相同的子串就删掉,不管有多少个,返回子串个数。
#include
#include
#include
#include
intdelete_sub_str(constchar*str,constchar*sub_str,char*result)
{
assert(str!
=NULL&&sub_str!
=NULL);//当程序str&sub_str其中一个为空时,程序就会断下
constchar*p,*q;
char*t,*temp;//char是字符串
p=str;
q=sub_str;
t=result;
intn,count=0;
n=strlen(q);//n是子字符串的长度
temp=(char*)malloc(n+1);//malloc=memoryallocation,Malloc向系统申请分配指定size个字节的内存空间
memset(temp,0x00,n+1);
//void*memset(void*s,intch,size_tn);将s中前n个字节用ch替换并返回s,0x00是16进制的0
while(*p)
{
memcpy(temp,p,n);
if(strcmp(temp,q)==0)
{
count++;
memset(temp,0x00,n+1);
p=p+n;
}
else
{
*t=*p;
p++;
t++;
memset(temp,0x00,n+1);
}
}
free(temp);
returncount;
}
intmain()
{
chars[100]={‘\0’};//\0二进制的0
intnum=delete_sub_str(“123abc12de234fg1hi34j123k”,”123”,s);
printf(“Thenumberofsub_stris%d\r\n”,num);//\r就是return回到本行行首,这就会把这一行以前的输出覆盖掉
printf(“Theresultstringis%s\r\n”,s);
}
2、约瑟夫环1
约瑟夫环是一个数学的应用问题:
已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。
从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
#include
#include
typedefstructNode//声明新的类型名(struct)来代替原有的类型名(Node)
{
intnum;
structNode*next;
}LinkList;
LinkList*creat(intn)
{
LinkList*p,*q,*head;//定义了三个结构体
inti=1;
p=(LinkList*)malloc(sizeof(LinkList));
p->num=i;
head=p;
for(i=2;i<=n;i++)
{
q=(LinkList*)malloc(sizeof(LinkList));
q->num=i;
p->next=q;
p=q;
}
p->next=head;/*使链表尾指向链表头形成循环链表*/
returnhead;
}
voidfun(LinkList*L,intm)
{
inti;
LinkList*p,*s,*q;
p=L;
printf("出列顺序为:
");
while(p->next!
=p)
{
for(i=1;i {q=p; p=p->next; } printf("%5d",p->num); s=p; q->next=p->next; p=p->next; free(s); } printf("%5d\n",p->num); } intmain() { LinkList*L; intn,m; n=9; m=5; L=creat(n); fun(L,m); return0; } 3.约瑟夫环2 •问题描述: 输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m。 从数列首位置开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止。 如果计数到达数列尾段,则返回数列首位置继续计数。 请编程实现上述计数过程,同时输出数值出列的顺序 比如: 输入的随机数列为: 3,1,2,4,初始计数值m=7,从数列首位置开始计数(数值3所在位置) 第一轮计数出列数字为2,计数值更新m=2,出列后数列为3,1,4,从数值4所在位置从新开始计数 第二轮计数出列数字为3,计数值更新m=3,出列后数列为1,4,从数值1所在位置开始计数 第三轮计数出列数字为1,计数值更新m=1,出列后数列为4,从数值4所在位置开始计数 最后一轮计数出列数字为4,计数过程完成。 输出数值出列顺序为: 2,3,1,4。 •要求实现函数: void array_iterate(int len, int input_array[], int m, int output_array[]) 【输入】int len: 输入数列的长度; int intput_array[]: 输入的初始数列 int m: 初始计数值 【输出】int output_array[]: 输出的数值出列顺序 【返回】无 •示例 输入: int input_array[] = {3,1,2,4},int len = 4, m=7 输出: output_array[] = {2,3,1,4} ////////////循环链表实现////////////////////// #include #include #include typedefstructNode { intnum; structnode*next; }node; node*creat(intlen,intinput_array[]) { node*h,*s,*p; inti; h=(node*)malloc(sizeof(node)); h->num=input_array[0]; p=h; for(i=1;i { s=(node*)malloc(sizeof(node)); s->num=input_array[i]; p->next=s; p=s; } p->next=h; return(h); } voidarray_iterate(intlen,intinput_array[],intm) { node*q,*p,*s; inti=0,j=0,k; intoutput_array[4]; p=creat(len,input_array); while(p->next! =p) { for(i=1;i { q=p; p=p->next; } m=p->num; printf("%5d",m); output_array[j++]=m; s=p; q->next=p->next; p=p->next; free(s); s=NULL; } m=p->num; printf("%5d\n",m); output_array[j]=p->num; k=j; for(j=0;j<=k;j++) { printf("%5d",output_array[j]); } } intmain() { intinput_array[]={3,1,2,4}; intlen=4; intm=7; intoutput_array[4]; array_iterate(len,input_array,m,output_array); } 4、数组&回文数组 #include #include voidhuiwen(charstr[]) { inti,len,k=1; len=strlen(str); for(i=0;i { if(str[i]! =str[len-i-1])//str一般结尾处有\0,所以需要-1 { k=0; break; } } if(k==1) printf("%s不是一个回文数\n",str); else printf("%s是一个回文数\n",str); } voidmain() { charstr[100]={0}; printf("Inputastring: ");/*提示输入Inputastring: */ scanf("%s",str);/*scan()函数输入一个字符串: */ huiwen(str); } 5.数组比较 •问题描述: 比较两个数组,要求从数组最后一个元素开始逐个元素向前比较,如果2个数组长度不等,则只比较较短长度数组个数元素。 请编程实现上述比较,并返回比较中发现的不相等元素的个数 比如: 数组{1,3,5}和数组{77,21,1,3,5}按题述要求比较,不相等元素个数为0 数组{1,3,5}和数组{77,21,1,3,5,7}按题述要求比较,不相等元素个数为3 •要求实现函数: int array_compare(int len1, int array1[], int len2, int array2[]) 【输入】int len1: 输入被比较数组1的元素个数; int array1[]: 输入被比较数组1; int len2: 输入被比较数组2的元素个数; int array2[]: 输入被比较数组2; 【输出】无 【返回】不相等元素的个数,类型为int •示例 1)输入: int array1[] = {1,3,5},int len1 = 3,int array2[] = {77,21,1,3,5},int len2 = 5 函数返回: 0 2)输入: int array1[] = {1,3,5},int len1 = 3,int array2[] = {77,21,1,3,5,7},int len2 = 6 函数返回: 3 #include #include #include intarray_compare(intlen1,intarray1[],intlen2,intarray2[]) { intcount=0; for(;len1>=0&&len2>=0;len1--,len2--) { if(array1[len1-1]==array2[len2-1]) { count++; } } returncount; } intmain() { intresult=0; intarray1[]={1,3,5}; intlen1=3; intarray2[]={77,12,1,3,5}; intlen2=5; result=array_compare(len1,array1,len2,array2);///result=array_compare(len1,array1[],len2,array2[]);不能这样 //函数形参中永远只是传得首地址,不能传数组切记切记! ! ! ! ! ! printf("theresultis%d",result); } 6、手机号码合法性判断(20分) ●问题描述: 我国大陆运营商的手机号码标准格式为: 国家码+手机号码,例如: 8613912345678。 特点如下: 1、长度13位; 2、以86的国家码打头; 3、手机号码的每一位都是数字。 请实现手机号码合法性判断的函数要求: 1)如果手机号码合法,返回0; 2)如果手机号码长度不合法,返回1 3)如果手机号码中包含非数字的字符,返回2; 4)如果手机号码不是以86打头的,返回3; 【注】除成功的情况外,以上其他合法性判断的优先级依次降低。 也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。 ●要求实现函数: intverifyMsisdn(char*inMsisdn) 【输入】char*inMsisdn,表示输入的手机号码字符串。 【输出】无 【返回】判断的结果,类型为int。 ●示例 输入: inMsisdn=“869123456789“ 输出: 无 返回: 1 输入: inMsisdn=“88139123456789“ 输出: 无 返回: 3 输入: inMsisdn=“86139123456789“ 输出: 无 返回: 0 #include #include #include #include #defineLENGTH13 intverifyMsisdn(char*inMsisdn) { char*pchar=NULL; assert(inMsisdn! =NULL); if(LENGTH==strlen(inMsisdn)) { if(('8'==*inMsisdn)&&(*(inMsisdn+1)=='6')) { while(*inMsisdn! ='\0') { if((*inMsisdn>='0')&&(*inMsisdn<='9'))//判断字符串全为数字 inMsisdn++; else return2; } } else return3; } else return1; return0; } intmain() { char*pchar=NULL; unsignedcharichar=0; intresult; switch(ichar) { case0: pchar="8612345363789";break; case1: pchar="861111111111111";break; case2: pchar="86s1234536366";break; default: break; } result=verifyMsisdn(pchar); printf("resultis%d\n",result); } 注: LINK: fatalerrorLNK1168: cannotopenDebug/Test.exeforwriting,需要关闭窗口 7、合并字符串(指针) 说明: 编写一个程序实现功能: 将两个字符串合并为一个字符串并且输出,用指针实现。 charstr1[20]={“Hello”},str2[20]={“World”}; 答案: #include intmain() { charstr1[20]={“Hello”},str2[20]={“World”}; char*p=str1,*q=str2; while(*p)p++; while(*q) { *p=*q; p++; q++; } *p=‘\0’; printf(“%s\n”,str1); return0; } 8、简单四则运算 •问题描述: 输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值 注: 1、表达式只含 +, -, *, / 四则运算符,不含括号 2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况 3、要考虑加减乘除按通常四则运算规定的计算优先级 4、除法用整数除法,即仅保留除法运算结果的整数部分。 比如8/3=2。 输入表达式保证无0作为除数情况发生 5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况 •要求实现函数: int calculate(int len,char *expStr) 【输入】int len: 字符串长度; char *expStr: 表达式字符串; 【输出】无 【返回】计算结果 •示例 1)输入: char *expStr = “1+4*5-8/3” 函数返回: 19 2)输入: char *expStr = “8/3*3” 函数返回: 6 #include /* *authorbywanww *time: 2011-09-07 */ usingnamespacestd; intarray_compare(intlen1,intarray1[],intlen2,intarray2[]) { if(len1==len2){ intcount=0; for(inti=0;i { if(array1[i]! =array2[i])count++; } returncount; }elseif(len1 returnarray_compare(len1,array1,len1,array2+len2-len1); }else{ returnarray_compare(len2,array1+len1-len2,len2,array2); } } voidarray_iterate(intlen,intinput_array[],intm,intoutput_array[]) { int*flag=newint[len]; memset(flag,0,len*4); inthasout=0;//已经出列的数字个数 intstart=0;//开始的下标号 intj=0;//当前以报到的数字 while(true) { if(flag[start]==0)//当前元素还没出列 { j++; if(j==m)//已经计数到m,当前start下标的元素出列 { output_array[hasout]=input_array[start]; flag[start]=1;//标记当前元素已经出列 hasout++; if(hasout==len)break;//所有的元素都已经出列,结束程序 //初始化下一轮的数字 j=0; m=input_array[start]; } } start++; if(start==len)start=0; } delete[]flag; } intcalculate(intlen,char*expStr) { struct{ charopdata[200]; inttop; }opstack; //定义操作符栈 opstack.top=-1; inti=0;//遍历字符串的下标 intt=0;//当前后缀表达式的长度 charch=expStr[i]; while(ch! ='\0') { switch(ch) { case'+': case'-': while(opstack.top! =-1) { expStr[t]=opstack.opdata[opstack.top]; opstack.top--; t++; } opstack.top++; opstack.opdata[opstack.top]=ch; break; case'*': case'/': while(opstack.top! =-1&&(opstack.opdata[opstack.top]=='*'||opstack.opdata[opstack.top]=='/')) { expStr[t]=opstack.opdata[opstack.top]; opstack.top--; t++; } opstack.top++; opstack.opdata[opstack.top]=ch; break; default: expStr[t]=ch; t++; break; } i++; ch=expStr[i]; } while(opstack.top! =-1)//将栈中所有的剩余的运算符出栈 { expStr[t]=opstack.opdata[opstack.top]; opstack.top--; t++; } expStr[t]='\0'; struct{ intnumeric[200]; inttop; }data; data.top=-1; i=0; ch=expStr[i]; while(ch! ='\0') { if(ch>='0'&&ch<='9') { data.top++;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 综合 01 华为 题目