华为机试题及答案
1、通过键盘输入任意一个字符串序列,字符串可能包含多个子串,子串以空格分隔。请编写一个程序,自动分离出各个子串,并使用’,’将其分隔,并且在最后也补充一个’,’并将子串存储。
测试:输入:“abcdefgh i d”?输出:“abc,def,gh,i,d,”
#include#include<string、h>
voidDivideString(const char *pInputStr,long lInputLen, char *pOutputStr)
{
?int i=0,j=0;
int flag=0;
?while(pInputStr[i]=='')
{
?i++;
?}
?for(;i<lInputLen;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<string、h>
void convert(char*input,char*output)
{
int i;
?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';
}
int main()
{
?char in[20]={"asdfzzxzxz"};
?char on[20];
?//gets(in);
?convert(in,on);
printf("%s",on);
?return 0;
}
3、通过键盘输入一串小写字母(a~z)组成得字符串。请编写一个字符串过滤程序,若字符串中出现多个相同得字符,将非首次出现得字符过滤掉。
测试:输入:“afafafaf” 输出:“af”
#include<stdio、h>
#include<string、h>
void stringFilter(const char *pInputStr, long lInputLen, char*pOutputStr)
{
inti,j,count;
?int k=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';
}
int main()
{
?char in[20]={"aabbccabacddsads"};
char on[20];
?//gets(in);
stringFilter(in,strlen(in),on);
?printf("%s",on);
return0;
}
4、通过键盘输入一串小写字母(a~z)组成得字符串。请编写一个字符串压缩程序,将字符串中连续出席得重复字母进行压缩,并输出压缩后得字符串。
测试:输入:“cccddecc” 输出:“3c2de2c”
#include<stdio、h>
#include<string、h>
void stringZip(const char *pInputStr,long lInputLen, char *pO utputStr)
{
?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()
{
?char in[20]={"ccddecc"};
?char on[20];
?//gets(in);
?stringZip(in,strlen(in),on);
?printf("%s",on);
return0;
}
5、通过键盘输入100以内正整数得加、减运算式,请编写一个程序输出运算结果字符串。
输入字符串得格式为:“操作数1运算符操作数2”,“操作数”与“运算符”之间以一个空格隔开。
测试:输入:“4- 7” 输出:“-3”
#include<stdio、h>
#include<string、h>
#include
void arithmetic(const char *pInputStr, long lInputLen, char*pOutputStr)
{
?inti,count=0,re=0;
int x,y,z;
int num[2]={0};
char op;
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<lInputLen;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);
}
int main()
{
char in[20];
?char on[20];
?gets(in);
?arithmetic(in,strlen(in),on);
printf("%s",on);
return 0;
}
6、选秀节目打分,分为专家评委与大众评委,score[] 数组里面存储每个评委打得分数,judge_type[] 里存储与score[]数组对应得评委类别,judge_type [i]== 1,表示专家评委,judge_type[i]== 2,表示大众评委,n表示评委总数。打分规则如下:专家评委与大众评委得分数先分别取一个平均分(平均分取整),然后,总分=专家评委平均分*0、6 +大众评委* 0、4,总分取整。如果没有大众评委,则总分=专家评委平均分,总分取整。函数最终返回选手得分。#include<stdio、h>
#include<string、h>
#include<math、h>
intcal_score(int score[],int judge_type[],int n)
{
inti=0,gscore;
int pro=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;
?}
return gscore;
}
int main()
{
?intscore[5]={90,80,95,86,87};
?intjudge_type[5]={1,2,2,1,1};
int n=5;
?printf("%d",cal_score(score, judge_type, n));
return 0;
}
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<stdio、h>
#include<string、h>
#include