1、华为校园招聘机考试题总结厦门大学2012华为校园招聘机考试题总结(厦门大学)1、删除子串,只要是原串中有相同的子串就删掉,不管有多少个,返回子串个数。#include #include #include #include int delete_sub_str(const char *str,const char *sub_str,char *result) assert(str != NULL & sub_str != NULL); const char *p,*q; char *t,*temp; p = str; q = sub_str; t = result; int n,count =
2、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); return count;int main() char s100 = 0; int num = delete_sub_str(“123abc12de234fg
3、1hi34j123k”,”123”,s); printf(“The number of sub_str is %drn”,num); printf(“The result string is %srn”,s);2、约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3.n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。#include#includetypedef struct Node int num; struct Node *next;LinkList;LinkLi
4、st *creat(int n) LinkList *p,*q,*head; int i=1; p=(LinkList *)malloc(sizeof(LinkList); p-num=i; head=p; for(i=2;inum=i; p-next=q; p=q; p-next=head; /*使链表尾指向链表头 形成循环链表*/ return head;void fun(LinkList *L,int m) int i; LinkList *p,*s,*q; p=L; printf(出列顺序为:); while(p-next!=p) for(i=1;inext; printf(%5d,p
5、-num); s=p; q-next=p-next; p=p-next; free(s); printf(%5dn,p-num);int main() LinkList *L; int n, m; n=9; m=5; L=creat(n); fun(L,m); return 0;3、比较一个数组的元素是否为回文数组#include #include int huiwen(char str) int i,len,k=1; len=strlen(str); for(i=0;ilen/2;i+) if(stri!=strlen-i-1) k=1; break; if(k=0) printf(%s 不
6、是一个回文数n,str); else printf(%s 是一个回文数n,str);void main() char str100 = 0; int i; int len; printf(Input a string:); /*提示输入Input a string:*/ scanf(%s, str); /*scan()函数输入一个字符串:*/ huiwen(str);4、数组比较(20分) 问题描述:比较两个数组,要求从数组最后一个元素开始逐个元素向前比较,如果2个数组长度不等,则只比较较短长度数组个数元素。请编程实现上述比较,并返回比较中发现的不相等元素的个数比如:数组1,3,5和数组77,
7、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,intl
8、en2=5函数返回:02) 输入:intarray1=1,3,5,intlen1=3,intarray2=77,21,1,3,5,7,intlen2=6函数返回:#include#include#includeint array_compare(int len1, int array1, int len2, int array2) int count=0; for( ;len1=0&len2=0 ;len1-,len2-) if(array1len1-1=array2len2-1) count+; return count;int main() int result=0; int array1
9、=1,3,5; int len1=3; int array2=77,12,1,3,5; int len2=5; result=array_compare( len1, array1, len2, array2); /result=array_compare( len1, array1, len2, array2);不能这样 / 函数形参中永远只是传得首地址,不能传数组 切记切记! printf(the result is %d, result);5、约瑟夫问题 问题描述:输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m。从数列首位置开始计数,计数到m后,将数
10、列该位置数值替换计数值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,计数过程完成。输
11、出数值出列顺序为: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/循环链表实现/#include#include#includetypedef struct Node int num;
12、struct node *next; node;node *creat(int len , int input_array) node *h,*s,*p; int i; h=(node*)malloc(sizeof(node); h-num=input_array0; p=h; for(i=1;inum=input_arrayi; p-next=s; p=s; p-next=h; return (h);void array_iterate(int len, int input_array, int m) node *q,*p,*s; int i=0,j=0,k; int output_arra
13、y4; p=creat(len,input_array); while(p-next!=p) for(i=1;inext; m=p-num; printf(%5d,m); output_arrayj+=m; s=p; q-next=p-next; p=p-next; free(s); s=NULL; m=p-num; printf(%5dn,m); output_arrayj=p-num; k=j; for(j=0 ; j=k; j+) printf(%5d,output_arrayj); int main() int input_array=3,1,2,4; int len=4; int m
14、=7; int output_array4; array_iterate(len, input_array, m, output_array);6、 手机号码合法性判断(20分) 问题描述:我国大陆运营商的手机号码标准格式为:国家码+手机号码,例如:8613912345678。特点如下:1、 长度13位;2、 以86的国家码打头;3、 手机号码的每一位都是数字。 请实现手机号码合法性判断的函数要求:1) 如果手机号码合法,返回0;2) 如果手机号码长度不合法,返回13) 如果手机号码中包含非数字的字符,返回2;4) 如果手机号码不是以86打头的,返回3;【注】除成功的情况外,以上其他合法性判断
15、的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。 要求实现函数:int verifyMsisdn(char* inMsisdn)【输入】 char* inMsisdn,表示输入的手机号码字符串。【输出】 无【返回】 判断的结果,类型为int。 示例输入: inMsisdn = “869123456789“输出: 无返回: 1输入: inMsisdn = “88139123456789“输出: 无返回: 3输入: inMsisdn = “86139123456789“输出: 无返回: 0#include#include#include#include#
16、define LENGTH 13int verifyMsisdn(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 return 2 ; else return 3; else return 1; return 0;int main() char *pchar=NULL; uns
17、igned char ichar=0; int result; switch(ichar) case 0: pchar=8612345363789;break; case 1: pchar=861111111111111;break; case 2: pchar=86s1234536366; break; default: break; result =verifyMsisdn(pchar); printf(result is %dn,result);7、数组比较(20分) 问题描述:比较两个数组,要求从数组最后一个元素开始逐个元素向前比较,如果2个数组长度不等,则只比较较短长度数组个数元素。
18、请编程实现上述比较,并返回比较中发现的不相等元素的个数比如:数组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
19、=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#include#include#includeint array_compare(int len1, int array1, int len2, int array2) int count=0; for( ;len1=0&len2=0 ;len1-,len2-) if(array1len1-1=array2len2-1) count+; retu
20、rn count;int main() int result=0; int array1=1,3,5; int len1=3; int array2=77,12,1,3,5; int len2=5; result=array_compare(len1, array1, len2, array2); /result=array_compare( len1, array1, len2, array2);不能这样/ 函数形参中永远只是传得首地址,不能传数组 切记切记! printf(the result is %d, result);8、简单四则运算 问题描述:输入一个只包含个位数字的简单四则运算表
21、达式字符串,计算该表达式的值注: 1、表达式只含+,-,*,/四则运算符,不含括号2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况3、要考虑加减乘除按通常四则运算规定的计算优先级4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况 要求实现函数:intcalculate(intlen,char*expStr)【输入】 intlen:字符串长度;char*expStr:表达式字符串;【输出】 无【返回】 计
22、算结果 示例1) 输入:char*expStr=“1+4*5-8/3”函数返回:192) 输入:char*expStr=“8/3*3”函数返回:6 #include /* * author by wanww * time: 2011-09-07 */using namespace std;int array_compare(int len1, int array1, int len2, int array2) if(len1 = len2) int count = 0; for (int i=0;ilen1;i+) if(array1i!=array2i) count+; return cou
23、nt; else if(len1len2) return array_compare(len1, array1,len1,array2+len2-len1); else return array_compare(len2,array1+len1-len2,len2,array2); void array_iterate(int len, int input_array, int m,int output_array) int * flag = new intlen; memset(flag,0,len*4); int hasout=0; /已经出列的数字个数 int start = 0; /开
24、始的下标号 int j=0; /当前以报到的数字 while(true) if(flagstart = 0) /当前元素还没出列 j+; if(j=m) /已经计数到m,当前start下标的元素出列 output_arrayhasout = input_arraystart; flagstart = 1; /标记当前元素已经出列 hasout +; if(hasout = len) break; /所有的元素都已经出列,结束程序 /初始化下一轮的数字 j = 0; m = input_arraystart; start +; if(start=len) start = 0; delete fl
25、ag; int calculate(int len,char *expStr) struct char opdata200; int top; opstack; /定义操作符栈 opstack.top = -1; int i=0;/遍历字符串的下标 int t=0;/当前后缀表达式的长度 char ch = expStri; while (ch!=0) switch (ch) case +: case -: while (opstack.top != -1) expStrt = opstack.opdataopstack.top; opstack.top-; t+; opstack.top+; opstack.opdataopstack.top = ch; break; case *: case /: while (opstack.top != -1 & (opstack.opdataopstack.top =* | opstack.opdataopstack.top =/) ) expStrt = opstack.opdataopstack.top; opstack.top-; t+;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1