2017华为认证笔试题目
2017华为认证笔试题目是怎样的?以下是CN人才网小编整理的2017华为认证笔试题目,欢迎阅读参考!
2017华为认证笔试题目一
第一题【20分】:鉴定回文数组
给定一个数组判断是否是回文,这题没什么好说明,直接看代码:
1 #include
2 using namespace std;
3
4 bool isHuiWen(string s)
5 {
6 int length_s=s.length();
7 int i=0;
8 for(i=0;i<(length_s>>1);i++)
9 {
10 if(s.at(i)!=s.at(length_s-1-i))
11 return false;
12 }
13 return true;
14 }
15
16 int main()
17 {
18 string ss="iloveevolis";
19 if(isHuiWen(ss))
20 {
21 cout<<"Huiwen"<
22 }
23 else
24 {
25 cout<<"No"<
26 }
27 return 1;
28 }
第二题【30分】:求两个整型数组的异集,即A+B-(A与B的交集)。
这里只是提供我的一个思路:
这个问题的求解可以简化为统计数组A B中任何字符的个数,A+B-(A与B的交集)的结果就是统计仅仅出现过一次的数字:
但是题目中没有限制是字符,而是整形,数据量太大,这里借用了map操作,进行简化内存:
针对这个思路程序如下:
1 #include
2 #include
3 using namespace std;
4
5 map mi;
6 map::iterator mit;
7 int A[10]={1,2,3,4,5,6,3,2,8,9};
8 int B[10]={8,7,6,5,9,0,3,4,8,40};
9 int R[20];
10 int RC=0;
11
12
13 void getAB(int* a,int na,int* b,int nb)
14 {
15 string re;
16 mi.clear();
17 for(int i=0;i
18 {
19 mit=mi.find(a[i]);
20 if(mit!=mi.end())
21 {
22 mit->second++;
23 }
24 else
25 {
26 mi.insert(make_pair(a[i],1));
27 }
28 }
29
30 for(i=0;i
31 {
32 mit=mi.find(b[i]);
33 if(mit!=mi.end())
34 {
35 mit->second++;
36 }
37 else
38 {
39 mi.insert(make_pair(b[i],1));
40 }
41 }
42
43 for(mit=mi.begin(),i=0;mit!=mi.end();mit++)
44 {
45 if(mit->second==1)
46 {
47 R[i++]=mit->first;
48 }
49 }
50 RC=i;
51 }
52
53 int main()
54 {
55 getAB(A,10,B,10);
56 for(int i=0;i
57 {
58 cout<
59 }
60 return 1;
61 }
第三题【50分】:判定德州扑克的牌型。给5张牌,返回它的牌型,4个的,3个+对子,顺子,3个+2个单张,2对,1对,其他。
德州扑克我还是很喜欢玩的,其中牌型牌型可以有近10中结果,题目仅仅让我们判断七种。但是这七种结果不具有继承性,所以我们设计一个好的程序。
那么就要统一他们的表现形式,下面是我的思路:
排序
判断跳变次数
进行筛选结果
这样可以较为统一的处理各种结果,参考程序如下:
1 #include
2 #include
3 using namespace std;
4
5 struct Node{
6 char type;//0 1 2 3四种花色,可以考虑用enum类型
7 int v;//面值
8 };
9
10 Node N[5]={
11 {0,5},
12 {0,9},
13 {0,2},
14 {0,9},
15 {0,9},
16 };
17
18 int n_of_v[5]={0,0,0,0,0};
19
20 bool myCMP(Node& a,Node& b)
21 {
22 return a.v>b.v;
23 }
24
25 bool myNCMP(int a,int b)
26 {
27 return a>b;
28 }
29
30 //获取每个的个数
31 int getN(Node* Nv)
32 {
33 int i=0;
34 int j=0;
35 int n=1;
36 for(i=0;i<4;i++)
37 {
38 if(Nv[i].v==Nv[i+1].v)
39 {
40 n++;
41 }
42 else
43 {
44 n_of_v[j++]=n;
45 n=1;
46 }
47 }
48 n_of_v[j++]=n;
49 return j;
50 }
51
52 void showResult()
53 {
54 if(n_of_v[0]==4)
55 {
56 cout<<"4+1"<
57 }
58 else if(n_of_v[0]==3&&n_of_v[1]==2)
59 {
60 cout<<"3+2"<
61 }
62 else if(n_of_v[0]==3&&n_of_v[1]==1)
63 {
64 cout<<"3+1+1"<
65 }
66 else if(n_of_v[0]==2&&n_of_v[1]==2)
67 {
68 cout<<"2+2+1"<
69 }
70 else if(n_of_v[0]==2&&n_of_v[1]==1)
71 {
72 cout<<"2+1+1+1"<
73 }
74 else if(n_of_v[0]==1)
75 {
76 //可能是顺子
77 if(N[0].v==N[1].v+1
78 &&N[1].v==N[2].v+1
79 &&N[2].v==N[3].v+1
80 &&N[3].v==N[4].v+1)
81 {
82 cout<<"不好意思,出了个顺子"<
83 }
84 else
85 cout<<"五张单牌"<
86 }
87 }
88
89 //传入大小为5的结构体数组
90 //进行判断
91 int getType(Node* Nv)
92 {
93 //首先排序
94 sort(N,N+5,myCMP);
95 //提取个数
96 getN(Nv);
97 sort(n_of_v,n_of_v+5,myNCMP);
98
99 //根据n_数组进行判断
100
101 if(n_of_v[0]==4)
102 {
103 cout<<"四个一样的哦"<
104 }
105
106 return 1;
107 }
108 int main()
109 {
110 getType(N);
111 showResult();
112 return 1;
113 }
2017华为认证笔试题目二
1、通过键盘输入100以内正整数的加、减运算式,请编写一个程序输出运算结果字符串。
输入字符串的格式为:“操作数1 运算符 操作数2”,“操作数”与“运算符”之间以一个空格隔开。
补充说明:
1. 操作数为正整数,不需要考虑计算结果溢出的情况。
2. 若输入算式格式错误,输出结果为“0”。
要求实现函数:
void arithmetic(const char *pInputStr, long lInputLen, char *pOutputStr);
【输入】 pInputStr: 输入字符串
lInputLen: 输入字符串长度
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例
输入:“4 + 7” 输出:“11”
输入:“4 - 7” 输出:“-3”
输入:“9 ++ 7” 输出:“0” 注:格式错误
复制代码
1 void arithmetic(const char *pInputStr,long lInputLen,char *pOutputStr)
2 {
3 assert(pInputStr!=NULL && pOutputStr!=NULL && lInputLen>0);
4 int iOperand1=0;
5 int iOperand2=0;
6 char cSymbol;
7 long i;
8 for (i=0;;i++)
9 {
10 if (pInputStr[i]>='0' && pInputStr[i]<='9')
11 {
12 iOperand1=iOperand1*10+(pInputStr[i]-'0');
13 }
14 else if (pInputStr[i]==' ')
15 {
16 break;
17 }
18 else
19 {
20 return;
21 }
22 }
23
24 for (++i;;i++)
25 {
26 if (pInputStr[i]=='+' || pInputStr[i]=='-')
27 {
28 cSymbol=pInputStr[i];
29 }
30 else if (pInputStr[i]==' ')
31 {
32 break;
33 }
34 else
35 {
36 return;
37 }
38 }
39
40 for (++i;i
41 {
42 if (pInputStr[i]>='0' && pInputStr[i]<='9')
43 {
44 iOperand2=iOperand2*10+(pInputStr[i]-'0');
45 }
46 else
47 {
48 break;
49 }
50 }
51 int iTemp;
52 switch(cSymbol)
53 {
54 case '+':
55 iTemp=iOperand1+iOperand2;
56 break;
57 case '-':
58 iTemp=iOperand1-iOperand2;
59 break;
60 default:
61 break;
62 }
63
64 int k=0;
65 if (iTemp<0)
66 {
67 iTemp=-iTemp;
68 pOutputStr[0]='-';
69 k++;
70 }
71
72 char cTemp[10];
73 itoa(iTemp,cTemp,10);
74 int j=0;
75 while(cTemp[j])
76 {
77 pOutputStr[k++]=cTemp[j++];
78 }
79
80 pOutputStr[k]='\0';
81
82 }
复制代码
2、手机号码合法性判断(20分)
问题描述:
我国大陆运营商的手机号码标准格式为:国家码+手机号码,例如:8613912345678。特点如下:
1、 长度13位;
2、 以86的国家码打头;
3、 手机号码的每一位都是数字。
请实现手机号码合法性判断的.函数(注:考生无需关注手机号码的真实性,也就是说诸如86123123456789这样的手机号码,我们也认为是合法的),要求:
1) 如果手机号码合法,返回0;
2) 如果手机号码长度不合法,返回1
3) 如果手机号码中包含非数字的字符,返回2;
4) 如果手机号码不是以86打头的,返回3;
【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。
要求实现函数:
int verifyMsisdn(char* inMsisdn)
【输入】 char* inMsisdn,表示输入的手机号码字符串。
【输出】 无
【返回】 判断的结果,类型为int。
示例
输入: inMsisdn = “869123456789“
输出: 无
返回: 1
输入: inMsisdn = “88139123456789“
输出: 无
返回: 3
输入: inMsisdn = “86139123456789“
输出: 无
返回: 0
复制代码
1 int verifyMsisdn(char *inMsisdn)
2 {
3 assert(inMsisdn!=NULL);
4
5 int iLen=strlen(inMsisdn);
6 if (iLen!=13)
7 {
8 return 1;
9 }
10
11 for (int i=0;i
12 {
13 if (inMsisdn[i]<'0' || inMsisdn[i]>'9')
14 {
15 return 2;
16 }
17 }
18
19 if (inMsisdn[0]!='8' || inMsisdn[1]!='6')
20 {
21 return 3;
22 }
23
24 return 0;
25
26 }
复制代码
3、将一个字符串的元音字母复制到另一个字符串,并排序(30分)
问题描述:
有一字符串,里面可能包含英文字母(大写、小写)、数字、特殊字符,现在需要实现一函数,将此字符串中的元音字母挑选出来,存入另一个字符串中,并对字符串中的字母进行从小到大的排序(小写的元音字母在前,大写的元音字母在后,依次有序)。
说明:
1、 元音字母是a,e,i,o,u,A,E,I,O,U。
2、 筛选出来的元音字母,不需要剔重(chong);
最终输出的字符串,小写元音字母排在前面,大写元音字母排在后面,依次有序。
要求实现函数:
void sortVowel (char* input, char* output);
【输入】 char* input,表示输入的字符串
【输出】 char* output,排好序之后的元音字符串。
【返回】 无
示例
输入:char *input = “Abort!May Be Some Errors In Out System. “
输出:char *output =“aeeeooouAEIO “
复制代码
1 void sortVowel(char *pInput,char *pOutput)
2 {
3 assert(pInput!=NULL && pOutput!=NULL);
4
5 int iLen=strlen(pInput);
6 char *pSmall=new char[iLen+1];
7 char *pLarge=new char[iLen+1];
8
9 int iSmallCount=0;
10 int iLargeCount=0;
11
12 for (int i=0;i
13 {
14 if (pInput[i]=='a' || pInput[i]=='e' || pInput[i]=='i' || pInput[i]=='o' || pInput[i]=='u')
15 {
16 pSmall[iSmallCount++]=pInput[i];
17
18 }
19 else if (pInput[i]=='A' || pInput[i]=='E' || pInput[i]=='I' || pInput[i]=='O' || pInput[i]=='U')
20 {
21 pLarge[iLargeCount++]=pInput[i];
22 }
23 }
24
25 sort(pSmall,pSmall+iSmallCount);
26 sort(pLarge,pLarge+iLargeCount);
27
28 int j,k=0;
29 for (j=0;j
30 {
31 pOutput[k++]=pSmall[j];
32 }
33 for (j=0;j
34 {
35 pOutput[k++]=pLarge[j];
36 }
37
38 pOutput[k]='\0';
39
40 delete []pSmall;
41 delete []pLarge;
42 }
复制代码
4、我国公民的身份证号码特点如下:
1、 长度为18位;
2、 第1~17位只能为数字;
3、 第18位可以是数字或者小写英文字母x。
4、 身份证号码的第7~14位表示持有人生日的年、月、日信息。
例如:511002198808080111或51100219880808011x。
请实现身份证号码合法性判断的函数。除满足以上要求外,需要对持有人生日的年、月、日信息进行校验。年份大于等于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(请注意闰年的情况);
【注】除成功的情况外,以上其他合法性判断的优先级依次降低。也就是说,如果判断出长度不合法,直接返回1即可,不需要再做其他合法性判断。
要求实现函数:
int verifyIDCard(char* input)
【输入】 char* input,表示输入的身份证号码字符串
【输出】 无
【返回】 判断的结果,类型为int
示例
1) 输入:”511002111222”,函数返回值:1;
2) 输入:”511002abc123456789”,函数返回值:2;
3) 输入:”51100219880808123a”,函数返回值:3;
4) 输入:”511002188808081234”,函数返回值:4;
【2017华为认证笔试题目】相关文章:
华为认证笔试经验04-02
2017华为认证笔试试题练习04-02
华为笔试经验及题目05-08
华为认证笔试试题及答案04-06
华为HCNA-HNTD认证笔试经验04-05
华为hcna认证笔试试题及答案04-04
2017华为笔试真题03-30
华为笔试经验分享201703-30
华为认证网络工程师笔试经验02-26