华为上机笔试题.docx
- 文档编号:10508876
- 上传时间:2023-02-17
- 格式:DOCX
- 页数:106
- 大小:42.84KB
华为上机笔试题.docx
《华为上机笔试题.docx》由会员分享,可在线阅读,更多相关《华为上机笔试题.docx(106页珍藏版)》请在冰豆网上搜索。
华为上机笔试题
1.给定一个字符串,把字符串内的字母转换成该字母的下一个字母,a换成b,z换成a,Z换成A,如aBf转换成bCg,字符串内的其他字符不改变,给定函数,编写函数
voidStringchang(constchar*inpu,char*output)
其中input是输入字符串,output是输出字符串
#include
#include
voidStringchang(constchar*input,char*output)
{
constchar*p=input;
/*if(input==NULL)
{
printf("ERROR");//用这种表示方式可否?
return;//用return好不好?
}*/
assert(input!
=NULL);
while(*p!
='\0')
{
if((*p>='a')&&(*p<='y')||(*p>='A')&&(*p<='Y'))
*output=*p+1;
elseif(*p=='z'||*p=='Z')
*output=*p+1-26;
else
*output=*p;
output++;
p++;
}
*output=0;
}
voidmain()
{
chara[11]={"abc"};//如何模拟空指针的情况
charb[11];
Stringchang(a,b);
printf("%s",b);
}
2.求一个整型数字中有没有相同的部分,例如12389756123这个整型数字中相同的部分是123,相同的部分至少应该是2位数,如果有相同部分返回1,如果没有则返回0。
函数为intsame(intnum)其中num是输入的整型数字
#include
usingnamespacestd;
intsame(intnum)//整数值的范围:
longint为-2(共10位)到正2开头共10位;unsigned//longint为从0到4的共10位数
{
chara[11];
inti=0,m=0,j=0;
while(num)
{
a[i]=num%10+'0';
num=num/10;
i++;
j++;
}
i=0;
intk=j;
while(i { chartemp=a[i]; a[i]=a[j-1]; a[j-1]=temp; i++; j--; } for(i=0;i { for(j=i+1;j { if(a[i]==a[j]&&a[i+1]==a[j+1]) return1; } } return0;} intmain()//是不是用int会好一点? { inta,b; cin>>a; b=same(a); cout< return0; } 3.求两个字符串的乘积,结果存到字符串中,例如字符串一中存的“657891”,字符串二中存的“521”,分别将字符串中的字符转换成整型数字,进行计算后,再转换成字符类型存储起来. 函数为voidmul(char*input1,intn,char*input2,intm,char*output) 其中input1和input2是输入,n是input1的长度,m是input2的长度。 Output是输出 #include #include #include usingnamespacestd; voidmul(char*input1,intn,char*input2,intm,char*output) { longintnum1=0,num2=0,num3=0;//char*p1=input1;char*p2=input2; inti=0,j=0,temp; intsign1=0,sign2=0; assert(input1! =NULL&&input2! =NULL); //以下程序是将input1字符串转换为数字,考虑到了字符串中第一个字符为‘+’或者‘-’号的情况, //同时考虑到了非法输入时的处理情况。 if(*input1=='-') { input1++; sign1=1; } if(*input1=='+') input1++; while(*input1! ='\0') { assert(*input1<='9'&&*input1>='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<='9'&&*input2>='0'); num2=num2*10+(*input2-'0'); input2++; } if(sign2==1) num2=-num2; //将两个数相乘 num3=num1*num2; //考虑到结果为负数的情况,将整数转换为字符串,并且将字符串倒序 if(num3<0) { output[i]='-'; i++; j++; num3=-num3; } while(num3) { output[i]=num3%10+'0'; i++; num3=num3/10; } output[i]=0; //将字符串倒序 i--; while(j { temp=output[j]; output[j]=output[i]; output[i]=temp; j++; i--; } } intmain() { chara[10],b[10],c[10]; intanum,bnum; cin>>a; cin>>b; anum=strlen(a); bnum=strlen(b); mul(a,anum,b,bnum,c); cout< return0; } //用纯指针实现程序如下: #include #include voidmul(char*input1,intn,char*input2,intm,char*output) { intsum1=0,sum2=0,sum=0; inti=0; intsign1,sign2; char*p=input1,*q=input2,*s=output,*r=output; assert(input1! =NULL&&input2! =NULL); if(*p=='+') { p++; sign1=1; } elseif(*p=='-') { p++; sign1=0; } while(*p) { assert(*p<='9'&&*p>='0'); sum1=sum1*10+(*p-'0'); p++; } if(sign1==0) { sum1=-sum1; } //input2dechuli if(*q=='+') {q++;sign2=1;} elseif(*q=='-') {q++;sign2=0;} while(*q) { assert(*q<='9'&&*q>='0'); sum2=sum2*10+(*q-'0'); q++; } if(sign2==0) {sum2=-sum2;} //两数相乘 sum=sum1*sum2; //printf("%d",sum); if(sum<0) { sum=-sum; *s='-'; s++; r++;//因为返回的指针开始地址是output,所以这里output不能变,只能是另外用一个指针代替他 } while(sum) { *s=sum%10+'0'; sum=sum/10; s++; } *s=0; s--;//忘记s--了 //printf("%s\n",output); while(r { chartemp=*r; *r=*s; *s=temp; s--; r++; } //printf("%s\n",output); } voidmain() { chara[3]="12"; charb[3]="34"; charc[11]; mul(a,3,b,3,c); printf("%s",c); } 两个大数相乘: #include #include #include #defineN100 voidGetDigits(int*a,char*s); voidmultiply(int*a,int*b,int*c); main() { chars1[N],s2[N]; inti,j,a[N],b[N],c[N*2]; printf("\ninputnumbera: "); scanf("%s",s1); printf("\ninputnumberb: "); scanf("%s",s2); //把输入的字符串,按位存放到数组 GetDigits(a,s1); GetDigits(b,s2); multiply(a,b,c); //找到最高位 j=N*2-1; while(c[j]==0) j--; //打印计算结果 printf("\n%s*%s=",s1,s2); for(i=j;i>=0;i--) printf("%d",c[i]); } /*把字符串形式的数字按位存放到数组*/ voidGetDigits(int*a,char*s) { inti; chardigit; intlen=strlen(s); for(i=0;i *(a+i)=0; for(i=0;i { digit=*(s+i); *(a+len-1-i)=digit-'0'; } } /*把a*b的结果存储到数组c中,按位表示*/ voidmultiply(int*a,int*b,int*c) { inti,j; //先把结果数组设置为0 for(i=0;i *(c+i)=0; for(i=0;i for(j=0;j { *(c+i+j)+=*(a+i)**(b+j); printf("%d",*(c+i+j)); } //处理进位 for(i=0;i { *(c+i+1)+=*(c+i)/10;//进位累加到高位 *(c+i)=*(c+i)%10;//该位的最后结果 } } 5、删除子串(不会做),只要是原串中有相同的子串就删掉,不管有多少个,返回子串个数。 #include #include #include #include intdelete_sub_str(constchar*str,constchar*sub_str,char*result) { constchar*p,*q;//注意最刚开始就要加const p=str; q=sub_str; intcount=0; intnum=strlen(sub_str); assert(str! =NULL&&sub_str! =NULL); while(*p! ='\0')//没有想法 { if(*p==*q) { for(inti=1;i { if(*(p+i)! =*(q+i)) break; } if(i==num) { count++; p+=num; } } elseif(*p! =*q) { *result=*p; p++;//这里自己写错了 result++;//这里自己写错了 } } *result=0; returncount; } voidmain() { chars[100]={'\0'}; intnum=delete_sub_str("123abc12de234fg1hi34j123k","123",s); printf("Thenumberofsub_stris%d\r\n",num); printf("Theresultstringis%s\r\n",s); } //用指针实现 #include #include intdelete_sub_str(constchar*str,constchar*sub_str,char*result) { constchar*p,*q; char*r; p=str; q=sub_str; r=result; intnum=0,i=0,k=0; while(*(p+i)) { if(*(p+i)==*(q)) { for(intj=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; returnnum; } voidmain() { chars[100]={'\0'}; intnum=delete_sub_str("a123abc123de","123",s); printf("Thenumberofsub_stris%d\r\n",num); printf("Theresultstringis%s\r\n",s); } 6、比较一个数组的元素 是否为回文数组 #include #include #include inthuiwen(charstr[]) { char*p=str; inti=0; intj=strlen(str); assert(str! =NULL); j--; while(i { if(*(p+i)! =*(p+j)) { return0; } i++; j--; } return1; } /*或者是用下面的方法原理是一样的 inti=0,j=0; assert(str! =NULL); while(str[j]) { j++; } j--; while(i { if(str[i]! =str[j]) return0; i++; j--; } return1; */ voidmain() { charstr[100]={0}; inti; printf("Inputastring: ");/*提示输入Inputastring: */ scanf("%s",str);/*scan()函数输入一个字符串: */ i=huiwen(str); if(i==0) printf("%s不是一个回文数\n",str); elseif(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 •要求实现函数: 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 #include intarray_compare(intlen1,intarray1[],intlen2,intarray2[]) { intcount=0; assert(array1! =NULL&&array2! =NULL);//如何对传输的数组判空? while(len1! =0&&len2! =0)//做错了,写成了(len1! =-1&&len2! =-1),注意这里的len1与len2分别是数组的长度,不是下标编号! ! ! { if(array1[len1-1]! =array2[len2-1]) count++; len1--; len2--; } returncount; } voidmain() { intarray1[7]={1,2,3,4,5,6,7}; intarray2[3]={4,5,6}; intnum; num=array_compare(7,array1,3,array2); printf("%d",num);} 8、手机号码合法性判断(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 intverifyMsisdn(char*inMsisdn)//记住: 此处比较的是和字符‘0’比较,而不是和数字0比较 { char*p=inMsisdn; assert(p! =NULL); intnum=strlen(p); if(num! =13)//在面试的时候最好用宏定义表达: #defineLENGTH13 return1; for(inti=0;i<13;i++) if(*(p+i)<'0'||*(p+i)>'9') return2; if((*p! ='8')||(*(p+1)! ='6')) return3; return0; } voidmain() { charnumber[15]="8613312345678"; intsign=verifyMsisdn(number); printf("%d\n",sign); charnumber1[15]="86133123456789";//老是忘记: 不能对数组直接赋值 sign=verifyMsisdn(number1); printf("%d\n",sign); charnumber2[15]="861331234567@"; sign=verifyMsisdn(number2); printf("%d\n",sign); charnumber3[15]="8113312345679"; sign=verifyMsisdn(number3); printf("%d\n",sign); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华为 上机 笔试