你的位置:
首页
>
IT圈
>
华为机试题及答案
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;
}
}
}
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;
}
int main()
{
int task[9] = {0, 30, 155, 1, 80, 300, 170, 40, 99};
- . .可修编.
. . -
int system_task[9];
int user_task[9];
int n=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]);
}
return 0;
}
- . .可修编.
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;
}
}
}
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;
}
int main()
{
int task[9] = {0, 30, 155, 1, 80, 300, 170, 40, 99};
- . .可修编.
. . -
int system_task[9];
int user_task[9];
int n=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]);
}
return 0;
}
- . .可修编.