华为上机笔试题_第1页
华为上机笔试题_第2页
华为上机笔试题_第3页
华为上机笔试题_第4页
华为上机笔试题_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1.给定一个字符串,把字符串内的字母转换成该字母的下一个字母,a换成b,z换成a,Z换成A,如aBf转换成bCg,字符串内的其他字符不改变,给定函数,编写函数void Stringchang(const char*inpu,char*output)其中input是输入字符串,output是输出字符串#include#includevoid Stringchang(const char*input,char*output)const char *p=input;/*if(input=NULL)printf(ERROR); /用这种表示方式可否?return; /用return 好不好? */as

2、sert(input!=NULL);while(*p!=0)if(*p=a)&(*p=A)&(*p=Y)*output=*p+1;else if(*p=z|*p=Z)*output=*p+1-26;else*output=*p;output+;p+;*output=0;void main() char a11=abc; /如何模拟空指针的情况char b11; Stringchang(a,b);printf(%s,b);2. 求一个整型数字中有没有相同的部分,例如这个整型数字中相同的部分是123,相同的部分至少应该是2位数,如果有相同部分返回1,如果没有则返回0。函数为 int same(in

3、t num)其中num是输入的整型数字#includeusing namespace std;int same(int num) /整数值的范围:long int为-2(共10位)到正2开头共10位;unsigned /long int 为从0到4的共10位数char a11;int i=0,m=0,j=0;while(num)ai=num%10+0;num=num/10;i+;j+; i=0;int k=j;while(ij)char temp=ai;ai=aj-1;aj-1=temp;i+;j-;for(i=0;ik-2;i+) /更标准for(j=i+1;ja;b=same(a);cou

4、tbendl;return 0;3. 求两个字符串的乘积,结果存到字符串中,例如字符串一中存的“”,字符串二中存的“521”,分别将字符串中的字符转换成整型数字,进行计算后,再转换成字符类型存储起来.函数为 void mul(char *input1,int n,char *input2, int m,char *output)其中input1和input2是输入,n是input1的长度,m是input2的长度。Output是输出#include#include#includeusing namespace std;void mul(char *input1,int n,char *input

5、2,int m,char *output)long int num1=0,num2=0,num3=0; /char *p1=input1;char *p2=input2;int i=0,j=0,temp;int sign1=0,sign2=0;assert(input1!=NULL&input2!=NULL); /以下程序是将input1字符串转换为数字,考虑到了字符串中第一个字符为+或者-号的情况,/同时考虑到了非法输入时的处理情况。if(*input1=-)input1+;sign1=1;if(*input1=+)input1+;while(*input1!=0)assert(*input

6、1=0);num1=num1*10+(*input1-0);input1+; if(sign1=1)num1=-num1;/以下程序是将input2字符串转换为数字,考虑到了字符串中第一个字符为+或者-号的情况,/同时考虑到了非法输入时的处理情况。if(*input2=-)input2+;sign2=1;if(*input2=+)input2+;while(*input2!=0)assert(*input2=0);num2=num2*10+(*input2-0);input2+;if(sign2=1)num2=-num2;/将两个数相乘num3=num1*num2;/考虑到结果为负数的情况,将

7、整数转换为字符串,并且将字符串倒序if(num30)outputi=-;i+;j+;num3=-num3;while(num3)outputi=num3%10+0;i+;num3=num3/10;outputi=0;/将字符串倒序i-;while(ja;cinb;anum=strlen(a);bnum=strlen(b);mul(a,anum,b,bnum,c);coutcendl;return 0; /用纯指针实现程序如下:#include#includevoid mul(char *input1,int n,char *input2,int m,char *output)int sum1=

8、0,sum2=0,sum=0;int i=0;int sign1,sign2;char *p=input1,*q=input2,*s=output,*r=output;assert(input1!=NULL&input2!=NULL);if(*p=+)p+;sign1=1;else if(*p=-)p+;sign1=0;while(*p)assert(*p=0);sum1=sum1*10+(*p-0);p+;if(sign1=0)sum1=-sum1;/input2de chuliif(*q=+)q+;sign2=1;else if(*q=-)q+;sign2=0;while(*q)asser

9、t(*q=0);sum2=sum2*10+(*q-0);q+;if(sign2=0)sum2=-sum2;/两数相乘sum=sum1*sum2;/printf(%d,sum);if(sum0)sum=-sum;*s=-;s+;r+; /因为返回的指针开始地址是output,所以这里output不能变,只能是另外用一个指针代替他while(sum)*s=sum%10+0;sum=sum/10;s+;*s=0;s-; /忘记s- - 了/printf(%sn,output);while(rs)char temp=*r;*r=*s;*s=temp;s-;r+;/printf(%sn,output);

10、void main()char a3=12;char b3=34;char c11;mul(a,3,b,3,c);printf(%s,c);两个大数相乘:#include #include #include #define N 100void GetDigits(int *a,char *s);void multiply(int *a,int *b,int *c);main() char s1N,s2N; int i,j,aN,bN,cN*2; printf(n input number a: ); scanf(%s,s1); printf(n input number b: ); scanf

11、(%s,s2); /把输入的字符串,按位存放到数组 GetDigits(a,s1); GetDigits(b,s2); multiply(a,b,c); /找到最高位 j=N*2-1; while(cj=0) j-; /打印计算结果 printf(n %s * %s=,s1,s2); for(i=j;i=0;i-) printf(%d,ci);/*把字符串形式的数字按位存放到数组*/void GetDigits(int *a, char *s) int i; char digit; int len=strlen(s); for(i=0;iN;i+) *(a+i)=0; for(i=0;ilen

12、;i+) digit=*(s+i); *(a+len-1-i) = digit - 0; /*把a*b的结果存储到数组c中,按位表示*/void multiply(int *a,int *b,int *c) int i,j; /先把结果数组设置为0 for(i=0;iN*2;i+) *(c+i)=0; for(i=0;iN;i+) for(j=0;jN;j+) *(c+i+j)+=*(a+i) * *(b+j); printf(%d,*(c+i+j); / 处理进位 for(i=0;iN*2-1;i+) *(c+i+1)+=*(c+i)/10; /进位累加到高位 *(c+i)=*(c+i)%1

13、0; /该位的最后结果 5、删除子串(不会做),只要是原串中有相同的子串就删掉,不管有多少个,返回子串个数。#include #include #include #include int delete_sub_str(const char *str,const char *sub_str,char *result)const char *p,*q; /注意最刚开始就要加constp=str;q=sub_str;int count=0;int num=strlen(sub_str);assert(str!=NULL&sub_str!=NULL);while(*p!=0) /没有想法if(*p=*

14、q) for(int i=1;inum;i+)if(*(p+i)!=*(q+i)break;if(i=num)count+;p+=num;else if(*p!=*q)*result=*p;p+; /这里自己写错了result+; /这里自己写错了*result=0; return count;void main()char s100 = 0;int num = delete_sub_str(123abc12de234fg1hi34j123k,123,s);printf(The number of sub_str is %drn,num);printf(The result string is

15、 %srn,s); /用指针实现#include#includeint delete_sub_str(const char *str,const char *sub_str,char *result)const char *p,*q;char *r; p=str;q=sub_str;r=result;int num=0,i=0,k=0;while(*(p+i)if(*(p+i)=*(q)for(int j=0;*(q+j)!=0;j+)if(*(p+i+j)!=*(q+j)break;if(*(q+j)=0)num+;i+=j;else *(r+k)=*(p+i);k+;i+;*(r+k)=0

16、;return num;void main()char s100 = 0;int num = delete_sub_str(a123abc123de,123,s);printf(The number of sub_str is %drn,num);printf(The result string is %srn,s); 6、比较一个数组的元素是否为回文数组#include #include #include int huiwen(char str)char *p=str;int i=0;int j=strlen(str);assert(str!=NULL);j-;while(ij)if(*(p

17、+i)!=*(p+j)return 0;i+;j-;return 1;/*或者是用下面的方法 原理是一样的int i=0,j=0;assert(str!=NULL);while(strj)j+;j-;while(ij)if(stri!=strj)return 0;i+;j-;return 1; */void main() char str100 = 0; int i;printf(Input a string:); /*提示输入Input a string:*/scanf(%s, str); /*scan()函数输入一个字符串:*/i=huiwen(str);if(i=0) printf(%s

18、 不是一个回文数n,str);else if(i=1)printf(%s 是一个回文数n,str); 7、数组比较(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)【输入】 int

19、len1:输入被比较数组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函数返回:#include#include#include#includeint array_compare(int

20、 len1, int array1, int len2, int array2)int count=0;assert(array1!=NULL&array2!=NULL); /如何对传输的数组判空?while(len1!=0&len2!=0) /做错了,写成了(len1!=-1&len2!=-1),注意这里的len1与len2分别是数组的长度,不是下标编号!if(array1len1-1!=array2len2-1)count+;len1-;len2-;return count;void main()int array17=1,2,3,4,5,6,7;int array23=4,5,6;int

21、 num;num=array_compare(7,array1,3,array2);printf(%d,num); 8、 手机号码合法性判断(20分)l 问题描述:我国大陆运营商的手机号码标准格式为:国家码+手机号码,例如:78。特点如下:1、 长度13位;2、 以86的国家码打头;3、 手机号码的每一位都是数字。 请实现手机号码合法性判断的函数要求:1) 如果手机号码合法,返回0;2) 如果手机号码长度不合法,返回13) 如果手机号码中包含非数字的字符,返回2;4) 如果手机号码不是以86打头的,返回3;【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法

22、,直接返回1即可,不需要再做其他合法性判断。l 要求实现函数:int verifyMsisdn(char* inMsisdn)【输入】 char* inMsisdn,表示输入的手机号码字符串。【输出】 无【返回】 判断的结果,类型为int。l 示例输入: inMsisdn = “9“输出: 无返回: 1输入: inMsisdn = “789“输出: 无返回: 3输入: inMsisdn = “789“输出: 无返回: 0#include#include#include#includeint verifyMsisdn(char* inMsisdn) /记住:此处比较的是和字符0比较,而不是和数字

23、0比较char *p = inMsisdn;assert(p!=NULL);int num=strlen(p);if(num!=13) /在面试的时候最好用宏定义表达:#define LENGTH 13return 1;for(int i=0;i13;i+)if(*(p+i)9)return 2;if(*p!=8)|(*(p+1)!=6)return 3;return 0;void main()char number15=78;int sign=verifyMsisdn(number);printf(%dn,sign); char number115=789; /老是忘记:不能对数组直接赋值

24、sign=verifyMsisdn(number1);printf(%dn,sign);char number215=7;sign=verifyMsisdn(number2);printf(%dn,sign); char number315=79;sign=verifyMsisdn(number3);printf(%dn,sign);9、选秀节目打分,分为专家评委和大众评委,score 数组里面存储每个评委打的分数,judge_type 里存储与 score 数组对应的评委类别,judge_typei = 1,表示专家评委,judge_typei = 2,表示大众评委,n表示评委总数。打分规则

25、如下:专家评委和大众评委的分数先分别取一个平均分(平均分取整),然后,总分 = 专家评委平均分 *0.6 + 大众评委 * 0.4,总分取整。如果没有大众评委,则 总分 = 专家评委平均分,总分取整。函数最终返回选手得分。函数接口 int cal_score(int score, int judge_type, int n)#include#include#include#include#define N 5/总数:total 平均数:average 记住要强制类型转换为(int),记住不要忘记判断当大众评委/为0时的情况,自己还额外加了当专家评委为零的情况。#include#include#

26、include#include#define N 5int cal_score(int score, int judge_type, int n) /该如何判断数组为空时的情况int total1=0,total2=0,average1=0,average2=0,num1=0,num2=0;int sum;for(int i=0;in;i+)if(judge_typei=1)total1+=scorei;num1+;else if(judge_typei=2)total2+=scorei;num2+;if(num1=n)sum=(int)(total1/n); /加强制类型转换符是个好习惯!e

27、lse if(num2=n)sum=(int)(total2/num2);elseaverage1=(int)(total1/num1);average2=(int)(total2/num2);sum=(int)(0.6*average1+0.4*average2);return sum; int main()int scoreN;int judge_typeN;int numberlast=0;int i;printf(please input the %d score:n,N);for(i=0;iN;i+)scanf(%d,&scorei);printf(please input the

28、level(1:expert,2:dazhong)n);for(i=0;iN;i+)scanf(%d,&judge_typei);numberlast=cal_score(score,judge_type,N);printf(the last score is %dn,numberlast);return 0;10、给定一个数组input ,如果数组长度n为奇数,则将数组中最大的元素放到 output 数组最中间的位置,如果数组长度n为偶数,则将数组中最大的元素放到 output 数组中间两个位置偏右的那个位置上,然后再按从大到小的顺序,依次在第一个位置的两边,按照一左一右的顺序,依次存放剩下

29、的数。 例如:input = 3, 6, 1, 9, 7 output = 3, 7, 9, 6, 1; input = 3, 6, 1, 9, 7, 8 output =1, 6, 8, 9, 7, 3#include#include#include#include/注意这里输出数组显示,是用for循环printf,显示,而不能用cout数组名void sort(int input, int n, int output)int temp;for(int i=0;in;i+)for(int j=i;jn;j+)if(inputiinputj)temp=inputi;inputi=inputj;

30、inputj=temp;for(i=0;in;i+)printf(%2d,inputi);printf(n);if(n%2=1)int mid=(n-1)/2;outputmid=input0;for(i=1;i=mid;i+)outputmid-i=input2*i-1;outputmid+i=input2*i;elseintmid=n/2;outputmid=input0;for(i=1;imid;i+)outputmid-i=input2*i-1;outputmid+i=input2*i;output0=inputn-1;for(i=0;in;i+)printf(%2d,outputi)

31、;void main()int input = 3, 6, 1, 9, 7,8 ;int output6; int n=6;sort(input,n,output);11、操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。其中,系统任务的优先级 = 50且 = 255。优先级大于255的为非法任务,应予以剔除。现有一任务队列task,长度为n,task中的元素值表示任务的优先级,数值越小,优先级越高。函数scheduler实现如下功能,将task 中的任务按照系统任务、用户任务依次存放到 system_task 数组和 user_task 数组中(数组中元素的值是任务在task 数

32、组中的下标),并且优先级高的任务排在前面,数组元素为-1表示结束。 例如:task = 5,4,3,2,1,100,50 system_task = 1,2,3,4,5,-1 user_task = 50,100,-1(方法一:边插入边用直接插入排序的方法进行排序,不完善,此处只做了排序,并没有存入想对位置)void scheduler1(int task, int n, int system_task, int user_task)int label1=0,label2=0,i,j=0,k=0;for(i=0;in;i+)if(taski50)if(label1=0)system_task0

33、=taski;label1=1;j+;elseintm=taski;int x=j;if(taskisystem_taskj-1)while(m0)system_taskx=system_taskx-1;x-;system_taskx=m;else system_taskj=m;j+;else if(taski=255)if(label2=0)user_task0=taski;label2=1;k+;elseintn=taski;int y=k;if(taskiuser_taskk-1)while(n0)user_tasky=user_tasky-1;y-;user_tasky=n;else

34、user_taskk=n;k+;else if(taski255) system_taskj=-1; user_taskk=-1;void main()int task=5,4,3,2,1,100,50;int n=7;int system_task6; /需要预留-1的位置,这里为6,不能为5,否则结果有问题int user_task3; /需要预留-1的位置,这里为3,不能为2,否则结果有问题scheduler1(task,n,system_task, user_task);for(int i=0;i6;i+)printf(%3d,system_taski);printf(n);for(i

35、=0;i3;i+)printf(%4d,user_taski); (方法二:先分别放在对应的数组中,再排序)#include#include#include#includevoid scheduler1(int task, int n, int system_task1, int user_task1)int i,j=0,k=0,num1=0,num2=0,m;char a256=0;char system_task256=0;char user_task256=0;for(i=0;in;i+)if(taski50)system_taskj=taski;m=taski;am=i;j+;num1

36、+;else if(taski255) /下边的代码是显示分完组后的情况printf(未排序前system_task为:);for(i=0;i5;i+)printf( %3d,system_taski);printf(n);printf(未排序前user_task为:);for(i=0;i2;i+)printf(%4d,user_taski);printf(n);/对system_task中的数进行排序,冒泡法 printf(排序中system_task数的变化情况);for(i=0;inum1-1;i+)for(int m=0;msystem_taskm+1)int temp=system_

37、taskm;system_taskm=system_taskm+1;system_taskm+1=temp;/每调换一次显示其排序结果for(int i=0;i5;i+)printf(%3d,system_taski);printf(n);for(i=0;inum1;i+)m=system_taski;system_task1i=am;/对user_task中的数进行排序,冒泡法printf(排序中user_task数的变化情况);for(i=0;inum2-1;i+)for(int n=0;nuser_taskn+1)int temp=user_taskn;user_taskn=user_t

38、askn+1;user_taskn+1=temp;for(int i=0;i2;i+)printf(%4d,user_taski);printf(n); for(i=0;inum2;i+)m=user_taski;user_task1i=am; system_task1j=-1; user_task1k=-1;void main()int task=5,4,3,2,1,100,50;int n=7;int system_task6;int user_task3;scheduler1(task,n,system_task, user_task);printf(系统相对位置);for(int i=

39、0;i6;i+)printf(%3d,system_taski);printf(n);printf(用户相对位置);for(i=0;i3;i+)printf(%4d,user_taski);12、输入一个字符串,用指针求出字符串的长度。/不要忘记P+!#include #include int main() char str20, *p; int length=0; printf(“Please input a string: ”); gets(str); p=str; while(*p+) length+;printf(“The length of string is %dn”, lengt

40、h);return 0;13、使用C语言实现字符串中子字符串的替换描述:编写一个字符串替换函数,如函数名为 StrReplace(char* strSrc, char* strFind, char* strReplace),strSrc为原字符串,strFind是待替换的字符串,strReplace为替换字符串。举个直观的例子吧,如:“ABCDEFGHIJKLMNOPQRSTUVWXYZ”这个字符串,把其中的“RST”替换为“ggg”这个字符串,结果就变成了:ABCDEFGHIJKLMNOPQgggUVWXYZ目前程序有两个问题:第一:运行结果中老是多一个1,第二:不知道如何把改变了的字符串传

41、回去。#include#include#include#include#include#includevoid StrReplace(char* strSrc, char* strFind, char* strReplace)char *p;p=(char*)malloc(sizeof(100);int n=strlen(strSrc);int m=strlen(strFind);int k=strlen(strReplace);int sign=0,num=0;for(int i=0;i+m*numn;i+)if(sign=1)if(*(strSrc+i+num*m)=*strFind)for(int j=0;jm;j+)if(*(strSrc+i+num*m+j)!=*(strFi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论