华为上机笔试题.docx

上传人:b****8 文档编号:10508876 上传时间:2023-02-17 格式:DOCX 页数:106 大小:42.84KB
下载 相关 举报
华为上机笔试题.docx_第1页
第1页 / 共106页
华为上机笔试题.docx_第2页
第2页 / 共106页
华为上机笔试题.docx_第3页
第3页 / 共106页
华为上机笔试题.docx_第4页
第4页 / 共106页
华为上机笔试题.docx_第5页
第5页 / 共106页
点击查看更多>>
下载资源
资源描述

华为上机笔试题.docx

《华为上机笔试题.docx》由会员分享,可在线阅读,更多相关《华为上机笔试题.docx(106页珍藏版)》请在冰豆网上搜索。

华为上机笔试题.docx

华为上机笔试题

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

函数返回:

#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);

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 管理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1