华为校园招聘上机试题及答案剖析Word下载.docx
《华为校园招聘上机试题及答案剖析Word下载.docx》由会员分享,可在线阅读,更多相关《华为校园招聘上机试题及答案剖析Word下载.docx(37页珍藏版)》请在冰点文库上搜索。
请编程实现上述比较,并返回比较中发现的不相等元素的个数
比如:
数组{1,3,5}和数组{77,21,1,3,5}按题述要求比较,不相等元素个数为0
数组{1,3,5}和数组{77,21,1,3,5,7}按题述要求比较,不相等元素个数为3
•要求实现函数:
int
array_compare(int
len1,
array1[],
len2,
array2[])
•示例
1)输入:
array1[]
=
{1,3,5},int
len1
3,int
array2[]
{77,21,1,3,5},int
len2
5函数返回:
2)输入:
{77,21,1,3,5,7},int
6函数返回:
3
函数如下:
usingnamespacestd;
intf(intlen1,intarry1[],intlen2,intarry2[])
{intk=0;
for(inti=len1-1,j=len2-1;
i>
=0&
j>
=0;
i--,j--)
if(arry1[i]!
=arry2[j])
k++;
returnk;
intnum1[]={1,3,5};
intnum2[]={77,21,1,3,5};
intk=f(3,num1,5,num2);
2.
约瑟夫问题
输入一个由随机数组成的数列(数列中每个数均是大于0的整数,长度已知),和初始计数值m。
从数列首位置开始计数,计数到m后,将数列该位置数值替换计数值m,并将数列该位置数值出列,然后从下一位置从新开始计数,直到数列所有数值出列为止。
如果计数到达数列尾段,则返回数列首位置继续计数。
请编程实现上述计数过程,同时输出数值出列的顺
输入的随机数列为:
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。
void
array_iterate(int
len,
input_array[],
m,
output_array[])
【输入】int
len:
输入数列的长度;
intput_array[]:
输入的初始数列
m:
初始计数值
【输出】int
output_array[]:
输出的数值出列顺序
输入:
input_array[]
{3,1,2,4},int
len
4,
m=7
输出:
output_array[]
{2,3,1,4}
voidfun(intlen,inta1[],intlen2,inta2[])
{intn=0,i=-1,k=1,m=len2;
while
(1){
for(intj=0;
j<
m;
i=(i+1)%len;
//注意这个是%,不要写成/
if(a1[i]!
=0)
j++;
}
m=a1[i];
a2[n++]=a1[i];
a1[i]=0;
if(k==len)break;
k++;
3.
简单四则运算
输入一个只包含个位数字的简单四则运算表达式字符串,计算该表达式的值
注:
1、表达式只含
+,
-,
*,
/
四则运算符,不含括号
2、表达式数值只包含个位整数(0-9),且不会出现0作为除数的情况
3、要考虑加减乘除按通常四则运算规定的计算优先级
4、除法用整数除法,即仅保留除法运算结果的整数部分。
比如8/3=2。
输入表达式保证无0作为除数情况发生
5、输入字符串一定是符合题意合法的表达式,其中只包括数字字符和四则运算符字符,除此之外不含其它任何字符,不会出现计算溢出情况
calculate(int
len,char
*expStr)
len:
字符串长度;
char
*expStr:
表达式字符串;
【输出】无
【返回】计算结果
*expStr
“1+4*5-8/3”函数返回:
19
“8/3*3”函数返回:
6
简化版的四则运算:
没有括号,只有加减乘除四种运算
intfun(chara[],intlen)//字符数组和字符数组的长度
{intnum[20];
charstr[20];
intk1=0,k2=0;
intdata=0;
for(inti=0;
i<
len;
i++)//主要运算
{if(a[i]>
a[i]<
num[k1++]=a[i]-'
if(a[i]=='
-'
||a[i]=='
+'
str[k2++]=a[i];
*'
{num[k1-1]=num[k1-1]*(a[i+1]-'
);
i++;
}//遇见*,就运算,结果保存在数组中
/'
{num[k1-1]=num[k1-1]/(a[i+1]-'
inttemp=num[0];
intj=0;
//两个数组只剩下数组和加减运算符
while(j<
k2){//顺序运算
if(str[j]=='
temp=temp-num[j+1];
elseif(str[j]='
temp=temp+num[j+1];
j++;
returntemp;
{hara[]="
3*3+7+4/3"
intk=fun(a,9);
函数实现2:
中序表达式转换为后序表达式,使用算法实现
intisp(charc)
{intp;
switch(c){
case'
:
p=1;
break;
p=0;
returnp;
char*transf(intlen,chara[],charb[])
stack<
char>
s1;
i++)
)b[k++]=a[i];
else
{if(s1.empty())s1.push(a[i]);
elsewhile(isp(a[i])<
=isp(s1.top()))
{b[k++]=s1.top();
s1.pop();
s1.push(a[i]);
while(s1.empty()){
b[k++]=s1.top();
s1.pop();
b[k]='
returnb;
voidfun(charc,stacks2)
{charp1,p2;
if(!
s2.empty()){
p1=s2.top();
s2.pop();
elsepos=false;
"
kongzhan"
p2=s2.top();
s2.top();
if(pos=true)
switch(c){
case'
s2.push(p1+p2);
s2.push(p2-p1);
s2.push(p1*p2);
s2.push(p2/p1);
voideval(chara[])
{stack<
s2;
for(inti=len;
i++){
switch(a[i]){
fun(a[i],&
s2);
default:
s2.push(a[i]-'
{chara[]="
1+4*5-8/3"
intlen=strlen(a);
charb[20];
char*q=transf(9,a,b);
q<
第五题:
一副牌中发五张扑克牌给你:
让你判断数字的组成:
有以下几种情况:
1:
四条:
即四张一样数值的牌(牌均不论花色)2:
三条带一对
3:
三条带两张不相同数值的牌4:
两对5:
顺子
包括
10,J,Q,K,A
6:
什么都不是7:
只有一对
思路:
将数组排序,统计相同的数字的个数,再分情况讨论
voidsort(inta[])
{inttemp;
5;
for(intj=0;
j++)
if(a[i]>
a[j])
{temp=a[i];
a[i]=a[j];
a[j]=temp;
voidtest(inta[])
{int*b=newint[5];
intk=1;
{b[i]=a[i];
4;
if(a[j]==a[j+1])
if(k==4){
if(b[1]==b[3])
cout<
四条"
else
三条带一对"
if(k==3){
if(b[1]!
=b[2]||b[2]!
=b[3])
三条带两个不同的牌"
两对"
if(k==2)
cout<
一对"
if(k==1){
if(b[4]-b[0]==4&
b[4]-b[1]==3&
b[4]-b[2]==2&
b[4]-b[3]==1)
顺子<
什么都不是"
{inta[]={1,2,4,4,4};
test(a);
第二题:
求两个数组的和差就是去掉两个数组中相同的元素然后将两个数组中的元素存放在一个新的数组中
,按大小顺序排序
将数组A和数组B分别进行排序,然后将A与B进行比较,重复的跳过去,不重复的赋给数组C,依次输出。
while(i<
la&
j<
lb)
{if(aa[i]<
bb[j])
{
c[sub]=aa[i];
++sub;
++i;
elseif(aa[i]>
{c[sub]=bb[j];
++j;
elseif(aa[i]==bb[j])
{++i;
}}
for(;
i<
la;
++i)
{c[sub]=aa[i];
lb;
++j)
{c[sub]=bb[j];
四:
逆序单链表
node*reverse(node*head)
{node*p1,*p2,*p3;
p1=head;
p2=head->
next;
while(p2){
p3=p2->
p2->
next=p1;
p1=p2;
p2=p3;
head->
next=NULL;
head=p1;
returnhead;
2.将一个字符串的元音字母复制到另一个字符串,并排序(30分)
问题描述:
有一字符串,里面可能包含英文字母(大写、小写)、数字、特殊字符,现在需要实现一函数,将此字符串中的元音字母挑选出来,存入另一个字符串中,并对字符串中的字母进行从小到大的排序(小写的元音字母在前,大写的元音字母在后,依次有序)。
说明:
1、元音字母是a,e,i,o,u,A,E,I,O,U。
2、筛选出来的元音字母,不需要剔重;
最终输出的字符串,小写元音字母排在前面,大写元音字母排在后面,依次有序。
要求实现函数:
voidsortVowel(char*input,char*output);
voidfun(chara[],chars[])//提取元音字母,放入数组
{inti=0,n=0;
while(a[i]!
a'
e'
i'
o'
u'
s[n++]=a[i];
elseif
(a[i]=='
A'
E'
I'
O'
U'
i++;
chartemp;
//将数组排序
n-1;
n-i-1;
if(s[j]>
s[j+1])
{temp=s[j];
s[j]=s[j+1];
s[j+1]=temp;
intk=0;
//定位大写字母的最后位置
while(s[k]>
s[k]<
Z'
k++;
n;
j++)//输出原字符串
s[j]<
'
'
char*p=newchar[20];
//将字符串变换位置,输出。
char*q=p;
for(inti=k;
{*p=s[i];
p++;
k;
{*p=s[j];
*p='
{charstr[]="
HaJsdStOoAOeINaPQaWEiAIiO"
chars[20];
fun(str,s);
3.身份证号码合法性判断
我国公民的身份证号码特点如下:
1、长度为18位;
2、第1~17位只能为数字;
3、第18位可以是数字或者小写英文字母x。
4、身份证号码的第7~14位表示持有人生日的年、月、日信息。
例如:
511002198808080111或511002198********x。
请实现身份证号码合法性判断的函数。
除满足以上要求外,需要对持有人生日的年、月、日信息进行校验。
年份大于等于1900年,小于等于2100年。
需要考虑闰年、大小月的情况。
所谓闰年,能被4整除且不能被100整除或能被400整除的年份,闰年的2月份为29天,非闰年的2月份为28天。
其他情况的合法性校验,考生不用考虑。
函数返回值:
1)如果身份证号合法,返回0;
2)如果身份证号长度不合法,返回1;
3)如果身份证号第1~17位含有非数字的字符,返回2;
4)如果身份证号第18位既不是数字也不是英文小写字母x,返回3;
5)如果身份证号的年信息非法,返回4;
6)如果身份证号的月信息非法,返回5;
7)如果身份证号的日信息非法,返回6(请注意闰年的情况);
intverifyIDCard(char*input)
示例
”511002111222”,函数返回值:
1;
”511002abc123456789”,函数返回值:
2;
3)输入:
”51100219880808123a”,函数返回值:
3;
4)输入:
”511002188********4”,函数返回值:
4;
5)输入:
”511002198********4”,函数返回值:
5;
6)输入:
6;
7)输入:
”511002198902291234”,函数返回值:
7;
8)输入:
0;
intfun(char*str)
{intyear=0,month=0,day=0;
if((strlen(str)-1)<
18)//1
{for(inti=0;
18;
{if(str[i]>
str[i]<
)//2
;
elsereturn2;
if(str[17]=='
x'
||(str[17]>
str[17]<
))//3
{for(inti=6;
10;
year=year*10+str[i]-'
if(year>
1900&
year<
2100)//4
{for(inti=10;
12;
month=month*10+str[i]-'
if(month>
0&
month<
=12)//5
{for(inti=12;
14;
day=day*10+str[i]-'
if(day<
=31)//6
{if(year%4!
month==2&
day<
=28)
return0;
elseif(year%4==0&
29)
elseif(year%4!
=4&
month!
=2&
31)
elsereturn6;
}
elsereturn6;
}
elsereturn5;
}
elsereturn4;
elsereturn3;
elsereturn1;
340621198608377817"
intk=fun(a);
}第二题:
比较一个数组的元素是否为回文数组
判断是否是回文数组:
boolfun(chara[])
intn=strlen(a);
inti=0,j=n-1;
while(i<
j){
if(a[i]!
=a[j])
returnfalse;
j--;
returntrue;
}第三题:
求两个数组的和差:
就是去掉两个数组中相同的元素然后将两个数组中的元素存放在一个新的数组中且数组A中元素要在B数组元素之前思路:
利用循环比较,将相同的数字的标记为0,再赋给数组C
{inta[]={1,3,5,7,9,12,13};
ints[]={1,3,5,6,7,8,9};
intlen1=sizeof(a)/sizeof(int);
intlen2=sizeof(s)/sizeof(int);
len1;
len2;
if(a[i]==s[j])
{a[i]=0;
s[j]=0;
intt[30];
intk=0,i=0,j=0;
len1){
t[k++]=a[i];
len2){
if(s[j]!
t[k++]=s[j