1、最全华为上机试题及部分答案2011年华为软件校园招聘编程测验1、请上机编写程序,按题目要求提交文件。详见考试说明,点击进入考试说明3、评卷通过在给定用例输入下,严格按照试题要求比较考生实现函数的输出与预设输出。两者相同则得分,不同则不得分。4、评卷人保证测试用例输入参数的合法性,考生不用考虑输入参数非法或异常的情况5、评卷人保证测试用例输入在被测函数正常合法情况下使用不会导致程序错误6、如果考生函数异常导致程序崩溃或死循环,则自动评卷可能会被人为终止,剩余用例不被执行,无法得分7、基于上述阅卷规则,请考生严格按照题目要求功能实现程序,尽量保证实现函数的稳健性,同时建议完成一道题并调试保证正确性
2、后,再考虑并实现下一题目(17)1,判断电话号码是否合法:/要注意情况包含,有可能会同时出现几种不好的情况,要按照顺序输出错误。不能同时输出好几种错误,应该是这样包含:先判断长度是否符合,再判断是否以86打头,再判断有无其他字符int fun(char num) char *p=num; int n=strlen(num); if(n=13) if(*p=8&*(p+1)=6) while(*p!=0) if(*p=0&*p=9) p+; else return 2; if(*p=0) return 0; else return 3; else return 1;int main() char
3、 num=87139a3887671; int k=fun(num); coutk=0&j=0;i-,j-) if(arry1i!=arry2j) k+; return k;int main() int num1=1,3,5; int num2=77,21,1,3,5; int k=f(3,num1,5,num2); coutkendl; return 0;2.约瑟夫问题 问题描述:输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m。从数列首位置开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有
4、数值出列为止。如果计数到达数列尾段,则返回数列首位置继续计数。请编程实现上述计数过程,同时输出数值出列的顺比如: 输入的随机数列为:3,1,2,4,初始计数值m=7,从数列首位置开始计数(数值3所在位置)第一轮计数出列数字为2,计数值更新m=2,出列后数列为3,1,4,从数值4所在位置从新开始计数第二轮计数出列数字为3,计数值更新m=3,出列后数列为1,4,从数值1所在位置开始计数第三轮计数出列数字为1,计数值更新m=1,出列后数列为4,从数值4所在位置开始计数最后一轮计数出列数字为4,计数过程完成。输出数值出列顺序为:2,3,1,4。 要求实现函数:voidarray_iterate(int
5、len,intinput_array,intm,intoutput_array)【输入】 intlen:输入数列的长度;intintput_array:输入的初始数列intm:初始计数值【输出】 intoutput_array:输出的数值出列顺序 示例输入:intinput_array=3,1,2,4,intlen=4,m=7输出:output_array=2,3,1,4函数如下:void fun(int len,int a1,int len2,int a2) int n=0,i=-1,k=1,m=len2; while(1) for(int j=0;jm;) i=(i+1)%len; /注意
6、这个是%,不要写成/ if(a1i!=0) j+; m=a1i; a2n+=a1i; a1i=0; if(k=len)break; k+; 3.简单四则运算 问题描述:输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值注: 1、表达式只含+,-,*,/四则运算符,不含括号2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况3、要考虑加减乘除按通常四则运算规定的计算优先级4、除法用整数除法,即仅保留除法运算结果的整数部分。比如8/3=2。输入表达式保证无0作为除数情况发生5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任
7、何字符,不会出现计算溢出情况 要求实现函数:intcalculate(intlen,char*expStr)【输入】 intlen:字符串长度;char*expStr:表达式字符串;【输出】 无【返回】 计算结果 示例1) 输入:char*expStr=“1+4*5-8/3” 函数返回:192) 输入:char*expStr=“8/3*3” 函数返回:6 简化版的四则运算:没有括号,只有加减乘除四种运算int fun(char a,int len) /字符数组和字符数组的长度 int num20; char str20; int k1=0,k2=0; int data=0; for(int i
8、=0;i=0&ai=9) numk1+=ai-0; if(ai=-|ai=+) strk2+=ai; if(ai=*) numk1-1=numk1-1*(ai+1-0);i+;/遇见*,就运算,结果保存在数组中 if(ai=/) numk1-1=numk1-1/(ai+1-0);i+; int temp=num0; int j=0; /两个数组只剩下数组和加减运算符 while(jk2) /顺序运算 if(strj=-) temp=temp-numj+1; else if(strj=+) temp=temp+numj+1; j+; return temp;int main() har a=3*
9、3+7+4/3; int k=fun(a,9); coutkendl; return 0; 函数实现2:中序表达式转换为后序表达式,使用算法实现int isp(char c) int p; switch(c) case *: case /:p=1;break; case +: case -: p=0;break; return p;char* transf(int len,char a,char b) int k=0; stack s1; for(int i=0;i=0&ai=9)bk+=ai; else if(s1.empty()s1.push(ai); else while(isp(ai)
10、=isp(s1.top() bk+=s1.top();s1.pop(); s1.push(ai); while(s1.empty() bk+=s1.top(); s1.pop(); bk=0; return b;void fun(char c,stack s2) char p1,p2; if(!s2.empty() p1=s2.top();s2.pop(); else pos=false; coutkongzhanendl; if(!s2.empty() p2=s2.top();s2.top(); else pos=false; coutkongzhanendl; if(pos=true) s
11、witch(c) case +:s2.push(p1+p2);break; case -:s2.push(p2-p1);break; case *:s2.push(p1*p2);break; case /:s2.push(p2/p1);break; void eval(char a) stack s2; for(int i=len;ilen;i+) switch(ai) case +: case -: case *: case /:fun(ai,&s2);break; default:s2.push(ai-0);break; int main() char a=1+4*5-8/3; int l
12、en=strlen(a); char b20; char *q=transf(9,a,b); coutqendl; return 0;第五题:一副牌中发五张扑克牌给你:让你判断数字的组成:有以下几种情况:1:四条:即四张一样数值的牌(牌均不论花色) 2:三条带一对3:三条带两张不相同数值的牌 4:两对 5:顺子包括10,J,Q,K,A6:什么都不是 7:只有一对 思路:将数组排序,统计相同的数字的个数,再分情况讨论void sort(int a) int temp; for(int i=0;i5;i+) for(int j=0;jaj) temp=ai;ai=aj;aj=temp;void t
13、est(int a) int *b=new int5; int k=1; for(int i=0;i5;i+) bi=ai; for(int j=0;j4;j+) if(aj=aj+1) k+; if(k=4) if(b1=b3) cout四条endl; else cout三条带一对endl; if(k=3) if(b1!=b2|b2!=b3) cout三条带两个不同的牌endl; else cout两对endl; if(k=2) cout一对endl; if(k=1) if(b4-b0=4&b4-b1=3&b4-b2=2&b4-b3=1) cout顺子endl; else cout什么都不是
14、endl; int main() int a=1,2,4,4,4; test(a); return 0;(19)第二题:求两个数组的和差就是去掉两个数组中相同的元素然后将两个数组中的元素存放在一个新的数组中,按大小顺序排序思路:将数组A和数组B分别进行排序,然后将A与B进行比较,重复的跳过去,不重复的赋给数组C,依次输出。 while(i la & j lb) if(aai bbj) csub = bbj; +sub; +j; else if(aai = bbj) +i; +j; for(; i la; +i) csub = aai; +sub; for(; j next; while(p2)
15、 p3=p2-next; p2-next=p1; p1=p2; p2=p3; head-next=NULL; head=p1; return head;(33)2. 将一个字符串的元音字母复制到另一个字符串,并排序(30分)问题描述:有一字符串,里面可能包含英文字母(大写、小写)、数字、特殊字符,现在需要实现一函数,将此字符串中的元音字母挑选出来,存入另一个字符串中,并对字符串中的字母进行从小到大的排序(小写的元音字母在前,大写的元音字母在后,依次有序)。说明:1、 元音字母是a,e,i,o,u,A,E,I,O,U。 2、 筛选出来的元音字母,不需要剔重;最终输出的字符串,小写元音字母排在前面
16、,大写元音字母排在后面,依次有序。要求实现函数:void sortVowel (char* input, char* output);using namespace std;void fun(char a,char s) /提取元音字母,放入数组 int i=0,n=0; while(ai!=0) if(ai=a|ai=e|ai=i|ai=o|ai=u) sn+=ai; else if (ai=A|ai=E|ai=I|ai=O|ai=U) sn+=ai; i+; char temp; /将数组排序 for(int i=0;in-1;i+) for(int j=0;jsj+1) temp=sj;
17、sj=sj+1;sj+1=temp; int k=0; /定位大写字母的最后位置 while(sk=A&sk=Z) k+; for(int j=0;jn;j+) /输出原字符串 coutsj ; coutendl;char *p=new char20; /将字符串变换位置,输出。char *q=p; for(int i=k;in;i+) *p=si;p+; for(int j=0;jk;j+) *p=sj;p+; *p=0; coutqendl;int main() char str=HaJsdStOoAOeINaPQaWEiAIiO; char s20; fun(str,s); return
18、 0;(32)3. 身份证号码合法性判断我国公民的身份证号码特点如下:1、 长度为18位;2、 第117位只能为数字;3、 第18位可以是数字或者小写英文字母x。4、 身份证号码的第714位表示持有人生日的年、月、日信息。例如:511002 19880808 0111或511002 198*x。请实现身份证号码合法性判断的函数。除满足以上要求外,需要对持有人生日的年、月、日信息进行校验。年份大于等于1900年,小于等于2100年。需要考虑闰年、大小月的情况。所谓闰年,能被4整除且不能被100整除 或 能被400整除的年份,闰年的2月份为29天,非闰年的2月份为28天。其他情况的合法性校验,考生
19、不用考虑。函数返回值:1) 如果身份证号合法,返回0;2) 如果身份证号长度不合法,返回1;3) 如果身份证号第117位含有非数字的字符,返回2;4) 如果身份证号第18位既不是数字也不是英文小写字母x,返回3;5) 如果身份证号的年信息非法,返回4;6) 如果身份证号的月信息非法,返回5;7) 如果身份证号的日信息非法,返回6(请注意闰年的情况);要求实现函数:int verifyIDCard(char* input)示例1) 输入:”511002 111222”,函数返回值:1;2) 输入:”511002 abc123456789”,函数返回值:2;3) 输入:”511002 198808
20、08123a”,函数返回值:3;4) 输入:”511002 188*4”,函数返回值:4;5) 输入:”511002 198*4”,函数返回值:5;6) 输入:”511002 198*4”,函数返回值:6;7) 输入:”511002 1989 0229 1234”,函数返回值:7;8) 输入:”511002 198*4”,函数返回值:0;int fun(char *str) int year=0,month=0,day=0; if(strlen(str)-1)18) /1 for(int i=0;i=0&stri=0&str17=9)/3 for(int i=6;i1900&year2100)
21、/4 for(int i=10;i0&month=12)/5 for(int i=12;i14;i+) day=day*10+stri-0; if(day=31)/6 if(year%4!=0&month=2&day=28) return 0; else if(year%4=0&month=2&day29) return 0; else if(year%4!=4&month!=2&day31) return 0; else return 6; else return 6; else return 5; else return 4; else return 3; else return 1;in
22、t main() char a=340621198608377817; int k=fun(a); coutkendl; return 0;第二题:比较一个数组的元素 是否为回文数组判断是否是回文数组:bool fun(char a) int n=strlen(a); int i=0,j=n-1; while(ij) if(ai!=aj) return false; i+;j-; return true;(19)第三题:求两个数组的和差:就是去掉两个数组中相同的元素 然后将两个数组中的元素存放在一个新的数组中 且数组A中元素要在B数组元素之前思路:利用循环比较,将相同的数字的标记为0,再赋给数组Cint main() int a=1,3,5,7,9,12,13; int s=1,3,5,6,7,8,9; int len1=sizeof(a)/sizeof(int); int len2=sizeof(s)/sizeof(int); for(int i=0;ilen1;i+) for(int j=0;jlen2;j+) if(ai=sj) ai=0;sj=0; int t30; int k=0,i=0,j=0; while(ilen1) if(ai!=0) tk+=ai; i+; while(jlen2) if(sj!
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1