华为校招历年机试题目_第1页
华为校招历年机试题目_第2页
华为校招历年机试题目_第3页
华为校招历年机试题目_第4页
华为校招历年机试题目_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

华为历年笔试题目总结因最近要参加华为的招聘,便从网上搜集了一些华为笔试历年题目,现总结献给大家,因本人非软件出生,水平有限,仅供参考,若有误处,请海涵。1、字符串问题•问题描述:把一个字符串中的除大写字母、小写字母和数字字符之外的其他字符都去掉,输出新字符串。要求实现函数:voidmy_string(char*input,char*output)【输入】char*input,输入的字符串【输出】char*output,输出的字符串【返回】无示例输入:input=“A*(BC&De+_fg/*"输出:output=“ABCDefg"输入:input=“aB+_9”输出:output=“aB9"程序如下:voidmy_string(char*input,char*output){inti,j;i=j=0;while(*(input+i)!='\O'){if((*(input+i)>='A'&&*(input+i)v='Z')ll(*(input+i)>='a'&&*(input+i)v='z')ll(*(input+i)>='0&&*(input+i)v=9)){*(output+j)=*(input+i);j++;}i++;}*(output+j+1)='\0';题目描述:输入一个字符串,将其中大写字母转换为对应小写字母之后的第五个字母,若原始大写字母为V〜Z,则转换为对应小写字母的值减21。其他字符不变,输出转换后的字符串。例如,对于字母A,则转换为小写字母f;若形参是字母W,则转换为小写字母b要求实现函数:voidTransferString(constchar*pInputStr,longlInputLen,char*pOutputStr);【输入】pInputStr: 输入字符串lInputLen: 输入字符串长度【输出】pOutputStr:输出字符串,空间已经开辟好,与输入字符串等长;【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出示例输入:“Axs3mWss”输出:“fxs3mbss”voidTransferString(constchar*pInputStr,longlInputLen,char*pOutputStr){inti=0;for(i=O;ivlInputLen;i++){if(pInputStr[i]>='A'&&pInputStr[i]v'V')pOutputStr[i]=pInputStr[i]+'a'-'A'+5;elseif(pInputStr[i]>='V&&pInputStr[i]v='Z')pOutputStr[i]=pInputStr[i]+'a'-'A'-21;elsepOutputStr[i]=pInputStr[i];}}3.单词统计题目描述:输入一段英文文本,用程序统计出现频率最高和最低的两个单词;英文文本中仅出现这四类字符:空格()、英文逗号(,)、英文句号(•)、英文大小写字母(a-z、A-Z)单词之间的分隔符仅考虑这三种:空格()、英文逗号(,)、英文句号(.);仅大小写不同的单词算同一个单词;如果两个单词出现次数相同,则在文本中首次出现的单词优先返回。返回的单词统一用小写字母返回例如:输入字符串“Helloworld,isaidhelloworldtotheworld”,返回“world”,“i”输入字符串“Somebodylikesomebody,idonotlikeit”,返回“somebody”,“i”要求实现函数:voidWordStat(constchar*pInputStr,char*pOutputHotWord,char*pOutputColdWord);【输入】pInputStr: 输入字符串,指向一段英文文本【输出】pOutputHotWord:输出字符串,返回出现次数最多的单词,该指针所指存储空间已经分配好,且足够大pOutputColdWord输出字符串,返回出现次数最少的单词,该指针所指存储空间已经分配好,且足够大【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出示例输入:“Helloworld,isaidhelloworldtotheworld”voidWordStat(constchar*pInputStr,char*pOutputHotWord,char*pOutputColdWord){〃分割输入字符串Helloworld,isaidhelloworldtotheworldstructeng_tchaifen[20];inti=O,j=O,k=O;while(pInputStr[i]!='\O'){while((pInputStr[i]!='')&&(pInputStr[i]!=',')&&(pInputStr[i]!='.')&&(pInputStr[i]!='\O')){if(pInputStr[i]>='a'&&pInputStr[i]v='z')chaifen[j].word[k]=pInputStr[i];elsechaifen[j].word[k]=pInputStr[i]+'a'-'A';i++;k++;}if(k>0){chaifen[j].word[k]='\0';j++;}k=0;i++;}〃统计重复次数并存入num中k=0;inta=0;for(i=0;ivj;i++){for(k=0;k<=j;k++){if(strcmp(chaifen[i].word,chaifen[k].word)==0)a++;}chaifen[i].num=a;a=0;}〃查找最大值inttempl=0,temp2=0;for(i=0;i<j;i++){if(chaifen[i].num>temp1){temp1=chaifen[i].num;temp2=i;strcpy(pOutputHotWord,chaifen[temp2].word);〃查找最小值templ=chaifen[O].num;for(i=0;ivj;i++){if(chaifen[i].numvtemp1){temp1=chaifen[i].num;temp2=i;}}strcpy(pOutputColdWord,chaifen[temp2].word);}/*手机号码合法性判断(20分)问题描述:我国大陆运营商的手机号码标准格式为:国家码+手机号码,例如:8613912345678。特点如下:1、长度13位;2、 以86的国家码打头;3、 手机号码的每一位都是数字。请实现手机号码合法性判断的函数(注:考生无需关注手机号码的真实性,也就是说诸如86123123456789这样的手机号码,我们也认为是合法的),要求:1)如果手机号码合法,返回0;2) 如果手机号码长度不合法,返回13)如果手机号码中包含非数字的字符,返回2;4) 如果手机号码不是以86打头的,返回3;【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。要求实现函数:intsintverifyMsisdn(char*inMsisdn)【输入】char*inMsisdn,表示输入的手机号码字符串。【输出】 无【返回】 判断的结果,类型为into示例输入:inMsisdn=“869123456789“输出: 无返回: 1输入:inMsisdn=“88139123456789“输出:无返回:3输入:inMsisdn=“86139123456789输出:无返回:*/#includeviostream>usingnamespacestd;intverifyMsisdn(char*inMsisdn){inti=0;while(*(inMsisdn+i)!='\O')i++;if(i!=14)return1;for(i=0;iv13;i++){if(*(inMsisdn+i)>'9'll*(inMsisdn+i)v'O')return2;}if(*(inMsisdn)!='8'll*(inMsisdn+1)!='6')return3;return0;}严2.将一个字符串的元音字母复制到另一个字符串,并排序(30分)问题描述:有一字符串,里面可能包含英文字母(大写、小写)、数字、特殊字符,现在需要实现一函数,将此字符串中的元音字母挑选出来,存入另一个字符串中,并对字符串中的字母进行从小到大的排序(小写的元音字母在前,大写的元音字母在后,依次有序)。说明:1、 元音字母是a,e,i,o,u,A,E,I,O,U。2、 筛选出来的元音字母,不需要剔重;最终输出的字符串,小写元音字母排在前面,大写元音字母排在后面,依次有序。要求实现函数:voidsortVowel(char*input,char*output);【输入】char*input,表示输入的字符串【输出】char*output,排好序之后的元音字符串。【返回】无示例输入:char*input=“Abort!MayBeSomeErrorsInOutSystem.“输出:char*output=“aeeeooAEIO“*/#includeviostream>usingnamespacestd;voidsortVowel(char*input,char*output){inti=0,j=0,k=0;intnumlong;chartemp;while(*(input+i)!='\O'){if(*(input+i)=='a'll*(input+i)=='e'll*(input+i)=='i'll*(input+i)=='o'll*(input+i)=='u'll*(input+i)=='A'll*(input+i)=='E'll*(input+i)==Tll*(input+i)=='O'll*(input+i)=='U')*(output+j++)=*(input+i);i++;}numlong=j;for(i=l;ivj;i++){for(k=0;kvj-i;k++){if(*(output+k)>*(output+k+1)){temp=*(output+k);*(output+k)=*(output+k+1);*(output+k+1)=temp;}}}for(i=0,k=0;ivj;i++){if(*(output+k)>='A'&&*(output+k)v='Z')k++;}for(i=0;i<k;i++)*(output+numlong+i)=*(output+i);for(i=0;ivnumlong;i++)*(output+i)=*(output+i+k);*(output+numlong+1)='\0';}/*问题描述:把一个字符串中的除大写字母、小写字母和数字字符之外的其他字符都去掉,输出新字符串。要求实现函数:voidmy_string(char*input,char*output)【输入】char*input,输入的字符串【输出】char*output,输出的字符串【返回】无示例输入:input=“A*(BC&De+_fg/*”输出:output=“ABCDefg”输入:input=“aB+_9”输出:output=“aB9”*/#includeviostream>usingnamespacestd;voidmy_string(char*input,char*output){inti,j;i=j=0;while(*(input+i)!='\O'){if((*(input+i)>='A'&&*(input+i)v='Z')ll(*(input+i)>='a'&&*(input+i)v='z')ll(*(input+i)>='0&&*(input+i)v=9)){*(output+j)=*(input+i);j++;}i++;}*(output+j+1)='\0';}2、数组问题/*对一个数组,将数组中偶数从大到小排序,奇数从小到大排序,奇数和偶数交叉着放且输出数组第一位放奇数,若奇数和偶数不等长,则把剩下的直接放到数组中。*/#include<iostream>#include<math.h>usingnamespacestd;voidmaopaopaixul(int*ps,intnum)//从小至U大{inti,j;inttemp;for(i=l;ivnum;i++){for(j=0;j<num-i;j++){if(ps[j]>ps[j+1]){temp=ps[j];ps[j]=ps[j+1];ps[j+1]=temp;}}}}voidmaopaopaixu2(int*ps,intnum)//从大至到小{inti,j;inttemp;for(i=1;i<num;i++){for(j=0;j<num-i;j++){if(ps[j]<ps[j+1]){temp=ps[j];ps[j]=ps[j+1];ps[j+1]=temp;}}}}voidchangnum(int*pa,intnum){inti;intj=0;intoddnum=0,evennum=0;int*odd=(int*)malloc(num*sizeof(int));int*even=(int*)malloc(num*sizeof(int));for(i=0;ivnum;i++)〃奇偶数分开{if(pa[i]%2==1)odd[oddnum++]=pa[i];elseeven[evennum++]=pa[i];府F序maopaopaixu2(even,evennum);maopaopaixul(odd,oddnum);〃奇数和偶数交叉着放且输出数组第一位放奇数intnuml;if((evennum-oddnum)>=0)num1=(num-(evennum-oddnum))/2;elsenum1=(num-(oddnum-evennum))/2;for(i=0;iv2*num1;){pa[i++]=odd[j];pa[i++]=even[j];j++;}if(evennum>num1){for(i=2*num1;ivnum;i++)pa[i]=even[j++];}else{for(i=2*num1;ivnum;i++)pa[i]=odd[j++];}free(odd);free(even);}•问题描述:在掷骰子游戏中,会根据所掷数字在地图中前进几步,前进完成后需要根据当前地图位置所示的障碍进行相应操作,其中障碍表示:9:无障碍1:停掷一轮,即下轮所掷数字无效;2:后退两步,如果已经到起点不再后退;3:奖励前进一步如果在游戏过程中,已经走到地图终点,则游戏结束。根据输入的地图数组,和5个骰子数的数组,返回最终玩家前进了多少步。•要求实现函数:voiddice(intmap_len,int*map,int*dice_val,int*output)【输入】intmap」en,地图数组的长度int*map,地图数组,值表示障碍int*dice_val,5个骰子数的数组【输出】int*output,玩家共前进了多少步【返回】无注:玩家是从起始位置开始,即地图数组的第一位,骰子数只能是1~6示例输入:map_len=15,map={9,1,9,9,9,2,9,9,9,9,9,9,9,9,9},dice_val={1,2,1,3,1},返回:4输入:map_len=16,map={9,9,9,9,9,1,9,3,9,9,2,9,9,9,9,9},dice_val={2,1,4,1,6},返回:15intdice(intmap」en,int*map,int*dice_val,int*output){inti=O,j=O,k=O;while(iv5llk>map」en){k=k+*(dice_val+i);〃走的步数j=map[k];if(j==1)i++;if(j==2)k=k-2;if(k<0)k=0;if(j==3)k=k+1;i++;}if(k>map」en)k=map_len;*output=k;}/*有一个数组a[N]如a[10]={0,1,2,3,4,5,6,7,8,9}每隔两个数删除一个数,如0,1,2(删除),3,4,5(删除),6,7,8(删除),9,到数组尾部回到数组头部继续删除,要求编写一个函数实现实现上述操作,返回最后一个数的数组下标。函数接口:intgetLast(intiLen)参数:数组初始元素个数iLen*/#includeviostream>usingnamespacestd;intgetLast(intiLen){inti,len;int*s=(int*)malloc(sizeof(int)*iLen);for(i=0;iviLen;i++)s[i]=i;len=iLen;intj=O,k;while(len>l){if(j+2>len)j=j-len;elsej=j+2;for(k=j;kvlen-1;k++){s[k]=s[k+1];}len--;}return*s;}*1、选秀节目打分,分为专家评委和大众评委,score[]数组里面存储每个评委打的分数,judge_type[]里存储与score[]数组对应的评委类别,judge_type[i]==1,表示专家评委,judge_type[i]==2,表示大众评委,n表示评委总数。打分规则如下:专家评委和大众评委的分数先分别取一个平均分(平均分取整),然后,总分=专家评委平均分?*?0.6+大众评委*0.4,总分取整。如果没有大众评委,则总分=专家评委平均分,总分取整。函数最终返回选手得分。*/#includeviostream>usingnamespacestd;intavrscore(intscore[],intjudge_type[],intn){inti,ex_num,pu_num,ex_avr,pu_avr;ex_num=pu_num=ex_avr=pu_avr=O;for(i=0;i<n;i++){if(judge_type[i]==l){ex_avr+=score[i];ex_num++;}if(judge_type[i]==2){pu_avr+=score[i];pu_num++;}}if(pu_num==O)return(ex_avr/ex_num);elsereturn(int)(ex_avr/ex_num*0.6+pu_avr/pu_num*0.4);}/*2、给定一个数组input[],如果数组长度n为奇数,则将数组中最大的元素放到outputs数组最中间的位置,如果数组长度n为偶数,则将数组中最大的元素放到outputs数组中间两个位置偏右的那个位置上,然后再按从大到小的顺序,依次在第一个位置的两边,按照一左一右的顺序,依次存放剩下的数。例如:input[]={3,6,1,9,7}??output]]={3,7,9,6,1};input[]={3,6,1,9,7,8}???output]]=?{1,6,&9,7,3}函数接口voidsort(intinput[[,intn,intoutput]])*/#include<iostream>usingnamespacestd;voidsort(intinput]],intn,intoutput]]){inti,j,temp;for(i=1;i<n;i++){for(j=0;j<n-i;j++){)彳(询皿口]<询皿口+1]){temp=input]j];询皿口]=询皿口+1];input]j+1]=temp;output[n/2]=input[0];for(i=l,j=l;iv=n/2;i++,j++){output[n/2-i]=input[j];j++;output[n/2+i]=input[j];}}/*3、操作系统任务调度问题。操作系统任务分为系统任务和用户任务两种。其中,系统任务的优先级<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,&2,6,-1}*/#includeviostream>usingnamespacestd;voidscheduler1(inttask[],intsystem_task[],intuser_task[],intnum){inti,a=0,b=0,j,temp;int*user_task1=(int*)malloc(num*sizeof(int));int*system_task1=(int*)malloc(num*sizeof(int));for(i=0;ivnum;i++){if(task[i]<50){system_task[a]=i;*(system_task1+a)=task[i];a++;}if(task[i]>=50&&task[i]<=255){user_task[b]=i;*(user_taskl+b)=task[i];b++;}}for(i=1;iva;i++){for(j=0;j<a-i;j++){if(system_task1[j]>system_task1[j+1]){temp=system_task1[j];system_task1[j]=system_task1[j+1];system_task1[j+1]=temp;temp=system_task[j];system_task[j]=system_task[j+1];system_task[j+1]=temp;}}}system_task[a]=-1;for(i=1;i<b;i++){for(j=0;j<b-i;j++){if(user_task1[j]>user_task1[j+1]){temp=user_task1[j];user_task1[j]=user_task1[j+1];user_task1[j+1]=temp;temp=user_task[j];user_task[j]=user_task[j+1];user_task[j+1]=temp;}}user_task[b]=-1;从两个数组的最后一个元素比较两个数组中不同元素的个数,如有array1[5]={77,21,1,3,5},array2[3]={1,3,5},从array1[4]与array2[2]比较开始,到array1[2]与array[0]比较结束。这样得出它们不同的元素个数为0,若array1[6]={77,21,1,3,5,7},那么他们不同的元素为3。函数原型为intcompare_array(intlen1,intarray1[],intlen2,intarray2[]);其中,len1与Ien2分别为数组array1[]和array2[]的长度,函数返回值为两个数组不同元素的个数。以下是上题的函数完整实现:intcompare_array(intlenl,intarrayl[],intlen2,intarray2[]){inti;intnum=0;for(i=0;ivlen2;i++){if(array2[len2-1-i]==array1[len1-1-i])num++;}returnnum;}3、字符计算问题此问题是难点,我会将问题扩展之后给出更全面的答案•问题描述:在软件园开饭店的小明最近很郁闷,经常在进行账目核查时出错,每次的计算结果总是有偏差。小王知道后打算为小明解决这个问题,经过调查发现,问题出现在计算器上,当前的计算器计算方法大部分是:输入数据,输入运算符,再输入数据,立刻给出计算结果,然后不断循环。当计算结束时,如果出现偏差或者数据,无法回顾查看到底是哪一步出错,如果需要再次核查,还需要再全部输入一次,非常耽误时间。小王打算帮老板设计一种新的计算器,能够支持表达式的计算,由于是第一个版本,只需要支持整数的“+,-,*”和“()”即可,当然括号内的运算优先级高于括号外,“*”的优先级是咼于“+,-”的。注:输入的表达式字符串长度小于20。且表达式一定是合法的表达式。•要求实现函数:voidcalculate(char*input,int*rel)【输入】【输出】【返回】char*input,待计算的表达式int*rel,计算结果无示例1)输入:input=5+2-10*2+5输出:rel=-8#definemaxsize20structastack{inttop;intmaxtop;char*data;};typedefstructastack*Stack;voidpush(charx,Stacks){if(s->top!=s->maxtop){s->top++;s->data[s->top]=x;}}charpop(Stacks){if(s->top!=-1){s_>top__;return(s->data[(s->top)+l]);}}intcompare(chara,charb){if(b=='+'llb=='-'llb=='*'){switch(a){case('+'):return1;case('-'):return1;case('*'):if(b=='*')return1;elsereturn0;elsereturn0;voidcalculate(char*input,int*rel){Stacksl=(structastack*)malloc(sizeof(structastack));/创建si用于储存运算符Stacks2=(structastack*)malloc(sizeof(structastack));/创建s2用于临时存储s1->data=(char*)malloc(sizeof(char)*maxsize);s2->data=(char*)malloc(sizeof(char)*maxsize);s1->top=-1;s2->top=-1;s1->maxtop=maxsize;s2->maxtop=maxsize;chartemp=0;chartemp1,temp2;inti=0;intcomp;while(input[i]!='\O')〃将元素压入栈中{if(input[i]>='0'&&input[i]v='9')〃当元素是数字的时候{while(input[i]>='0'&&input[i]v=9)/计算数值{temp=(input[i]-'0')+temp*10;i++;}push(temp,s2);temp=0;}elseif(input[i]=='(')〃如果是(时候直接送入s1栈顶{push(input[i],s1);i++;}elseif(input[i]==')')//若取出的字符是“)”,则将距离S1栈栈顶最近的“//(”之间的运算符,逐个出栈,依次送入S2栈,此时抛弃“(”while((temp=pop(s1))!='(')push(temp,s2);}i++;temp=0;}else/*若取出的字符是运算符,则将该运算符与S1栈栈顶元素比较,如果该运算符优先级大于S1栈栈顶运算符优先级,则将该运算符进S1栈,否则,将S1栈的栈顶运算符弹出,送入S2栈中,直至S1栈栈顶运算符低于(不包括等于)该运算符优先级,则将该运算符送入S1栈。*/{while(compare(input[i],sl->data[sl->top])){temp=pop(s1);push(temp,s2);}push(input[i],s1);i++;temp=0;}}//将si中取出压入s2中while(s1->top!=-1){temp=pop(s1);push(temp,s2);}〃对s2逆序存入s1中while(s2->top!=-1){temp=pop(s2);push(temp,s1);}〃对s1中进行计算while(s1->top!=-1)temp=pop(sl);if(temp!='+'&&temp!='-'&&temp!='*'){push(temp,s2);}else{temp1=pop(

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论