2024年2月21日发(作者:掌元绿)
. . -
华为机试题及答案
1、通过键盘输入任意一个字符串序列,字符串可能包含多个子串,子串以空格分隔。请编写一个程序,自动分离出各个子串,并使用’,’将其分隔,并且在最后也补充一个’,’并将子串存储。
测试:输入:“abc def gh i d”
#include
#include
void DivideString(const char *pInputStr, long lInputLen, char *pOutputStr)
{
int i=0,j=0;
int flag=0;
while(pInputStr[i]==' ')
{
}
for(;i { if(pInputStr[i]==' ') { flag=1; continue; i++; 输出:“abc,def,gh,i,d,” - . .可修编. . . - } } } if(flag==1) { } pOutputStr[j++]=pInputStr[i]; flag=0; pOutputStr[j++]=','; pOutputStr[j++]=','; pOutputStr[j]='0'; int main() { } 2、将输入的字符串(字符串仅包含小写字母‘a’到‘z’),按照如下规则,循环转换后输出:a->b,b->c,…,y->z,z->a;若输入的字符串连续出现两个字母相同时,后char test[40]; char re[40]; gets(test); DivideString(test, strlen(test), re); printf("%s",re); return 0; - . .可修编. . . - 一个字母需要连续转换2次。例如:aa 转换为 bc,zz 转换为 ab;当连续相同字母超过两个时,第三个出现的字母按第一次出现算。 测试:输入:char*input="abbbcd" 输出:char*output="bcdcde" #include #include 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() { } 3、通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。 测试:输入:“afafafaf” 输出:“af” #include #include void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr) { int i,j,count; int k=0; for(i=0;i { count=0; char in[20]={"asdfzzxzxz"}; char on[20]; //gets(in); convert(in,on); printf("%s",on); return 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); return 0; - . .可修编. . . - } 4、通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。 测试:输入:“cccddecc” 输出:“3c2de2c” #include #include void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr) { int i,j=0,num=0; int k=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'; int main() { } 5、通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。 输入字符串的格式为:“操作数1 运算符操作数2”,“操作数”与“运算符”之间以一个空格隔开。 测试:输入:“4 - 7” 输出:“-3” #include #include char in[20]={"ccddecc"}; char on[20]; //gets(in); stringZip(in,strlen(in),on); printf("%s",on); return 0; - . .可修编. . . - #include void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr) { int i,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 { 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 #include #include int cal_score(int score[], int judge_type[], int n) { int i=0,gscore; int pro=0,pub=0; int pro_count=0,pub_count=0; for(i=0;i { if(judge_type[i]==1) { } if(judge_type[i]==2) pro_count++; pro=pro+score[i]; - . .可修编. . . - { 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() { int score[5]={90,80,95,86,87}; int judge_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 #include #include void sort(int input[], int n, int output[]) { int i,j,k,a; int temp; 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++]; } } int main() { int input[5]={99,80,95,86,87}; int output[5]; int n=5,i; sort(input,n,output); for(i=0;i - . .可修编. . . - } { } return 0; printf("%d ",output[i]); 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 void scheduler(int task[], int n, int system_task[], int user_task[]) { int i,j,temp; int a=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; } } } . . - 华为机试题及答案 1、通过键盘输入任意一个字符串序列,字符串可能包含多个子串,子串以空格分隔。请编写一个程序,自动分离出各个子串,并使用’,’将其分隔,并且在最后也补充一个’,’并将子串存储。 测试:输入:“abc def gh i d” #include #include void DivideString(const char *pInputStr, long lInputLen, char *pOutputStr) { int i=0,j=0; int flag=0; while(pInputStr[i]==' ') { } for(;i { if(pInputStr[i]==' ') { flag=1; continue; i++; 输出:“abc,def,gh,i,d,” - . .可修编. . . - } } } if(flag==1) { } pOutputStr[j++]=pInputStr[i]; flag=0; pOutputStr[j++]=','; pOutputStr[j++]=','; pOutputStr[j]='0'; int main() { } 2、将输入的字符串(字符串仅包含小写字母‘a’到‘z’),按照如下规则,循环转换后输出:a->b,b->c,…,y->z,z->a;若输入的字符串连续出现两个字母相同时,后char test[40]; char re[40]; gets(test); DivideString(test, strlen(test), re); printf("%s",re); return 0; - . .可修编. . . - 一个字母需要连续转换2次。例如:aa 转换为 bc,zz 转换为 ab;当连续相同字母超过两个时,第三个出现的字母按第一次出现算。 测试:输入:char*input="abbbcd" 输出:char*output="bcdcde" #include #include 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() { } 3、通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。 测试:输入:“afafafaf” 输出:“af” #include #include void stringFilter(const char *pInputStr, long lInputLen, char *pOutputStr) { int i,j,count; int k=0; for(i=0;i { count=0; char in[20]={"asdfzzxzxz"}; char on[20]; //gets(in); convert(in,on); printf("%s",on); return 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); return 0; - . .可修编. . . - } 4、通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。 测试:输入:“cccddecc” 输出:“3c2de2c” #include #include void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr) { int i,j=0,num=0; int k=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'; int main() { } 5、通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。 输入字符串的格式为:“操作数1 运算符操作数2”,“操作数”与“运算符”之间以一个空格隔开。 测试:输入:“4 - 7” 输出:“-3” #include #include char in[20]={"ccddecc"}; char on[20]; //gets(in); stringZip(in,strlen(in),on); printf("%s",on); return 0; - . .可修编. . . - #include void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr) { int i,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 { 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 #include #include int cal_score(int score[], int judge_type[], int n) { int i=0,gscore; int pro=0,pub=0; int pro_count=0,pub_count=0; for(i=0;i { if(judge_type[i]==1) { } if(judge_type[i]==2) pro_count++; pro=pro+score[i]; - . .可修编. . . - { 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() { int score[5]={90,80,95,86,87}; int judge_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 #include #include void sort(int input[], int n, int output[]) { int i,j,k,a; int temp; 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++]; } } int main() { int input[5]={99,80,95,86,87}; int output[5]; int n=5,i; sort(input,n,output); for(i=0;i - . .可修编. . . - } { } return 0; printf("%d ",output[i]); 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 void scheduler(int task[], int n, int system_task[], int user_task[]) { int i,j,temp; int a=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; } } }