12012华为校园招聘机考试题总结(厦门大学)1、删除子串,只要是原串中有相同的子串就删掉,不管有多少个,返回子串个数。#includestdio.h#includestdlib.h#includeassert.h#includestring.hintdelete_sub_str(constchar*str,constchar*sub_str,char*result){assert(str!=NULL&&sub_str!=NULL);constchar*p,*q;char*t,*temp;p=str;q=sub_str;t=result;intn,count=0;n=strlen(q);tmep=(char*)malloc(n+1);memset(temp,0x00,n+1);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’};intnum=delete_sub_str(“123abc12de234fg1hi34j123k”,”123”,s);printf(“Thenumberofsub_stris%d\r\n”,num);printf(“Theresultstringis%s\r\n”,s);}2、约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。#includestdio.h#includestdlib.htypedefstructNode{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++){2q=(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;im;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、比较一个数组的元素是否为回文数组#includestdio.h#includestring.hinthuiwen(charstr[]){inti,len,k=1;len=strlen(str);for(i=0;ilen/2;i++){if(str[i]!=str[len-i-1]){k=1;break;}}if(k==0)printf(%s不是一个回文数\n,str);elseprintf(%s是一个回文数\n,str);}voidmain(){charstr[100]={0};inti;3intlen;printf(Inputastring:);/*提示输入Inputastring:*/scanf(%s,str);/*scan()函数输入一个字符串:*/huiwen(str);}4、数组比较(20分)•问题描述:比较两个数组,要求从数组最后一个元素开始逐个元素向前比较,如果2个数组长度不等,则只比较较短长度数组个数元素。请编程实现上述比较,并返回比较中发现的不相等元素的个数比如:数组{1,3,5}和数组{77,21,1,3,5}按题述要求比较,不相等元素个数为0数组{1,3,5}和数组{77,21,1,3,5,7}按题述要求比较,不相等元素个数为3•要求实现函数:intarray_compare(intlen1,intarray1[],intlen2,intarray2[])【输入】intlen1:输入被比较数组1的元素个数;intarray1[]:输入被比较数组1;intlen2:输入被比较数组2的元素个数;intarray2[]:输入被比较数组2;【输出】无【返回】不相等元素的个数,类型为int•示例1)输入:intarray1[]={1,3,5},intlen1=3,intarray2[]={77,21,1,3,5},intlen2=5函数返回:02)输入:intarray1[]={1,3,5},intlen1=3,intarray2[]={77,21,1,3,5,7},intlen2=6函数返回:3#includestdlib.h#includestdio.h#includestring.hintarray_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);}5、约瑟夫问题•问题描述:输入一个由随机数组成的数列(数列中每个数均是大于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最后一轮计数出列数字为4,计数过程完成。输出数值出列顺序为:2,3,1,4。•要求实现函数:voidarray_iterate(intlen,intinput_array[],intm,intoutput_array[])【输入】intlen:输入数列的长度;intintput_array[]:输入的初始数列intm:初始计数值【输出】intoutput_array[]:输出的数值出列顺序【返回】无•示例输入:intinput_array[]={3,1,2,4},intlen=4,m=7输出:output_array[]={2,3,1,4}////////////循环链表实现//////////////////////#includestdio.h#includestdlib.h#includestring.htypedefstructNode{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;ilen;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;im;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;}5m=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);}6、手机号码合法性判断(20分)问题描述:我国大陆运营商的手机号码标准格式为:国家码+手机号码,例如:8613912345678。特点如下:1、长度13位;2、以86的国家码打头;3、手机号码的每一位都是数字。请实现手机号码合法性判断的函数要求:1)如果手机号码合法,返回0;2)如果手机号码长度不合法,返回13)如果手机号码中包含非数字的字符,返回2;4)如果手机号码不是以86打头的,返回3;【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。要求实现函数:intverifyMsisdn(char*inMsisdn)【输入】char*inMsisdn,表示输入的手机号码字符串。【输出】无【返回】判断的结果,类型为int。示例输入:inMsisdn=“869123456789“输出:无返回:1输入:inMsisdn=“88139123456789“输出:无返回:3输入:inMsisdn=“86139123456789“输出:无返回:0#includestdio.h#includestdlib.h#includeassert.h#includestring.h#defineLENGTH13intverifyMsisdn(char*inMsisdn){char*pchar=NULL;assert(inMsisdn!=NULL);if(LENGTH==strlen(inMsisdn)){if(('8'==*inMsisdn)&&(*(inMsisdn+1)=='6')){6while(*inMsisdn!='\0'){if((*inMsisdn='0')&&(*inMsisdn='9'))inMsisdn++;elsereturn2;}}elsereturn3;}elsereturn1;return0;}intmain(){char*pc