华为机试题及答案.docx
《华为机试题及答案.docx》由会员分享,可在线阅读,更多相关《华为机试题及答案.docx(17页珍藏版)》请在冰豆网上搜索。
华为机试题及答案
华为机试题及答案
1、通过键盘输入任意一个字符串序列,字符串可能包含多个子串,子串以空格分隔。
请编写一个程序,自动分离出各个子串,并使用’,’将其分隔,并且在最后也补充一个’,’并将子串存储。
测试:
输入:
“abcdefghid”输出:
“abc,def,gh,i,d,”
#include
#include
voidDivideString(constchar*pInputStr,longlInputLen,char*pOutputStr)
{
inti=0,j=0;
intflag=0;
while(pInputStr[i]=='')
{
i++;
}
for(;i{
if(pInputStr[i]=='')
{
flag=1;
continue;
}
if(flag==1)
{
flag=0;
pOutputStr[j++]=',';
}
pOutputStr[j++]=pInputStr[i];
}
pOutputStr[j++]=',';
pOutputStr[j]='\0';
}
intmain()
{
chartest[40];
charre[40];
gets(test);
DivideString(test,strlen(test),re);
printf("%s",re);
return0;
}
2、将输入的字符串(字符串仅包含小写字母‘a’到‘z’),按照如下规则,循环转换后输出:
a->b,b->c,…,y->z,z->a;若输入的字符串连续出现两个字母相同时,后一个字母需要连续转换2次。
例如:
aa转换为bc,zz转换为ab;当连续相同字母超过两个时,第三个出现的字母按第一次出现算。
测试:
输入:
char*input="abbbcd"输出:
char*output="bcdcde"
#include
#include
voidconvert(char*input,char*output)
{
inti;
for(i=0;i{
if(i==0)
{
output[i]=input[i]+1;
if(output[i]==123)
{
output[i]=97;
}
}
else
{
if(input[i]!
=input[i-1])
{
output[i]=input[i]+1;
if(output[i]==123)
{
output[i]=97;
}
}
else
{
output[i]=input[i]+2;
if(output[i]==123)
{
output[i]=97;
}
if(output[i]==124)
{
output[i]=98;
}
}
}
}
output[i+1]='\0';
}
intmain()
{
charin[20]={"asdfzzxzxz"};
charon[20];
//gets(in);
convert(in,on);
printf("%s",on);
return0;
}
3、通过键盘输入一串小写字母(a~z)组成的字符串。
请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。
测试:
输入:
“afafafaf”输出:
“af”
#include
#include
voidstringFilter(constchar*pInputStr,longlInputLen,char*pOutputStr)
{
inti,j,count;
intk=0;
for(i=0;i{
count=0;
for(j=0;j{
if(pInputStr[i]==pOutputStr[j])
{
count++;
}
}
if(count==0)
{
pOutputStr[k++]=pInputStr[i];
}
}
pOutputStr[k]='\0';
}
intmain()
{
charin[20]={"aabbccabacddsads"};
charon[20];
//gets(in);
stringFilter(in,strlen(in),on);
printf("%s",on);
return0;
}
4、通过键盘输入一串小写字母(a~z)组成的字符串。
请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
测试:
输入:
“cccddecc”输出:
“3c2de2c”
#include
#include
voidstringZip(constchar*pInputStr,longlInputLen,char*pOutputStr)
{
inti,j=0,num=0;
intk=0;
for(i=0;i<=lInputLen;i++)
{
if(i&&pInputStr[i]!
=pInputStr[i-1])
{
if(num>1)
{
pOutputStr[j++]=(char)num+'0';
}
pOutputStr[j++]=pInputStr[i-1];
num=1;
}
else
{
num++;
}
}
pOutputStr[j]='\0';
}
intmain()
{
charin[20]={"ccddecc"};
charon[20];
//gets(in);
stringZip(in,strlen(in),on);
printf("%s",on);
return0;
}
5、通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。
输入字符串的格式为:
“操作数1运算符操作数2”,“操作数”与“运算符”之间以一个空格隔开。
测试:
输入:
“4-7”输出:
“-3”
#include
#include
#include
voidarithmetic(constchar*pInputStr,longlInputLen,char*pOutputStr)
{
inti,count=0,re=0;
intx,y,z;
intnum[2]={0};
charop;
for(i=0;i{
if(pInputStr[i]=='')
{
count++;
}
}
if(count!
=2)
{
pOutputStr[0]='0';
pOutputStr[1]='\0';
return;
}
for(x=0;pInputStr[x]!
='';x++)
{
if(pInputStr[x]>='0'&&pInputStr[x]<='9')
{
num[0]=num[0]*10+pInputStr[x]-'0';
}
else
{
pOutputStr[0]='0';
pOutputStr[1]='\0';
return;
}
}
for(y=x+1;pInputStr[y]!
='';y++)
{
}
if(y-x-1!
=1)
{
pOutputStr[0]='0';
pOutputStr[1]='\0';
return;
}
else
{
if(pInputStr[y-1]!
='+'&&pInputStr[y-1]!
='-')
{
pOutputStr[0]='0';
pOutputStr[1]='\0';
return;
}
else
{
op=pInputStr[y-1];
}
}
for(z=y+1;z{
if(pInputStr[z]>='0'&&pInputStr[z]<='9')
{
num[1]=num[1]*10+pInputStr[z]-'0';
}
else
{
pOutputStr[0]='0';
pOutputStr[1]='\0';
return;
}
}
if(op=='+')
{
re=num[0]+num[1];
}
else
{
re=num[0]-num[1];
}
itoa(re,pOutputStr,10);
}
intmain()
{
charin[20];
charon[20];
gets(in);
arithmetic(in,strlen(in),on);
printf("%s",on);
return0;
}
6、选秀节目打分,分为专家评委和大众评委,score[]数组里面存储每个评委打的分数,judge_type[]里存储与score[]数组对应的评委类别,judge_type[i]==1,表示专家评委,judge_type[i]==2,表示大众评委,n表示评委总数。
打分规则如下:
专家评委和大众评委的分数先分别取一个平均分(平均分取整),然后,总分=专家评委平均分*0.6+大众评委*0.4,总分取整。
如果没有大众评委,则总分=专家评委平均分,总分取整。
函数最终返回选手得分。
#include
#include
#include
intcal_score(intscore[],intjudge_type[],intn)
{
inti=0,gscore;
intpro=0,pub=0;
intpro_count=0,pub_count=0;
for(i=0;i{
if(judge_type[i]==1)
{
pro_count++;
pro=pro+score[i];
}
if(judge_type[i]==2)
{
pub_count++;
pub=pub+score[i];
}
}
if(pub_count!
=0)
{
gscore=pro/pro_count*0.6+pub/pub_count*0.4;
}
else
{
gscore=pro/pro_count;
}
returngscore;
}
intmain()
{
intscore[5]={90,80,95,86,87};
intjudge_type[5]={1,2,2,1,1};
intn=5;
printf("%d",cal_score(score,judge_type,n));
return0;
}
7、给定一个数组input[],如果数组长度n为奇数,则将数组中最大的元素放到output[]数组最中间的位置,如果数组长度n为偶数,则将数组中最大的元素放到output[]数组中间两个位置偏右的那个位置上,然后再按从大到小的顺序,依次在第一个位置的两边,按照一左一右的顺序,依次存放剩下的数。
例如:
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
voidsort(intinput[],intn,intoutput[])
{
inti,j,k,a;
inttemp;
for(i=0;i{
for(j=0;j{
if(input[j]
{
temp=input[j+1];
input[j+1]=input[j];
input[j]=temp;
}
}
}
k=1;
a=1;
output[n/2]=input[0];
while(k{
output[n/2-a]=input[k++];
a++;
output[n/2+a-1]=input[k++];
}
}
intmain()
{
intinput[5]={99,80,95,86,87};
intoutput[5];
intn=5,i;
sort(input,n,output);
for(i=0;i{
printf("%d",output[i]);
}
return0;
}
8、操作系统任务调度问题。
操作系统任务分为系统任务和用户任务两种。
其中,系统任务的优先级<50,用户任务的优先级>=50且<=255。
优先级大于255的为非法任务,应予以剔除。
现有一任务队列task[],长度为n,task中的元素值表示任务的优先级,数值越小,优先级越高。
函数scheduler实现如下功能,将task[]中的任务按照系统任务、用户任务依次存放到system_task[]数组和user_task[]数组中(数组中元素的值是任务在task[]数组中的下标),并且优先级高的任务排在前面,优先级相同的任务按照入队顺序排列(即先入队的任务排在前面),数组元素为-1表示结束。
例如:
task[]={0,30,155,1,80,300,170,40,99}system_task[]={0,3,1,7,-1}user_task[]={4,8,2,6,-1}
#include
#include
#include
voidscheduler(inttask[],intn,intsystem_task[],intuser_task[])
{
inti,j,temp;
inta=0,b=0;
for(i=0;i{
if(task[i]<50)
{
system_task[a++]=i;
}
else
{
if(task[i]>=50&&task[i]<=250)
{
user_task[b++]=i;
}
}
}
for(i=0;i{
for(j=0;j{
if(task[system_task[j]]>task[system_task[j+1]])
{
temp=system_task[j+1];
system_task[j+1]=system_task[j];
system_task[j]=temp;
}
}
}
for(i=0;i
{
for(j=0;j{
if(task[user_task[j]]>task[user_task[j+1]])
{
temp=user_task[j+1];
user_task[j+1]=user_task[j];
user_task[j]=temp;
}
}
}
system_task[a]=-1;
user_task[b]=-1;
}
intmain()
{
inttask[9]={0,30,155,1,80,300,170,40,99};
intsystem_task[9];
intuser_task[9];
intn=9,i;
scheduler(task,n,system_task,user_task);
for(i=0;system_task[i]!
=-1;i++)
{
printf("%d",system_task[i]);
}
for(i=0;user_task[i]!
=-1;i++)
{
printf("%d",user_task[i]);
}
return0;
}