华为上机笔试题.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;ifor(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);
}