另外更新的2012华为题库地址链接如下:
地区一:
1. 编写函数string deletestring(string str,string sub_str)从str中查找匹配的字符串sub_str,采用最左匹配,且输出形式为str+"_"+匹配的次数
题目一的意思应该是求解字符串str中子字符串sub_str的个数,同时输出形式采用原字符串+"_"匹配次数
相信大家第一反应应该是采用kmp,那么下面给出常规优化kmp程序如下(采用字符串数组形式):
using namespace std;
int next[ 100 ];
void getnext( char b[])
{
int i = 1 ,j = 0 ; // ij
next[ 1 ] = 0 ;
while (i <= strlen(b))
{
if (j == 0 || b[i - 1 ] == b[j - 1 ])
{
i ++ ;
j ++ ;
next[i] = j;
}
else j = next[j]; //
}
}
int kmp( char a[], char b[])
{
int i = 1 ,j = 1 ; // i j
while (i <= strlen(a) && j <= strlen(b))
{
if (j == 0 || a[i - 1 ] == b[j - 1 ])
{
i ++ ;
j ++ ;
}
else j = next[j];
}
if (j > strlen(b))
return i - strlen(b);
else return 0 ;
}
2. 高精度数相加,string addBigInt(string num1,string num2) 需要考虑正负数相加
这道题是高精度计算中的最最简单的一题:
目的是模拟人手工运算的过程,进而进行结果的现实;
参考代码(编译环境:Visual Studio 6):
地区四:
第一题【20分】:鉴定回文数组
给定一个数组判断是否是回文,这题没什么好说明,直接看代码:
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 " << endl;
22 }
23 else
24 {
25 cout << " No " << endl;
26 }
27 return 1;
28 }
第二题【30分】:求两个整型数组的异集,即A+B-(A与B的交集)。
这里只是提供我的一个思路:
这个问题的求解可以简化为统计数组A B中任何字符的个数,A+B-(A与B的交集)的结果就是统计仅仅出现过一次的数字:
但是题目中没有限制是字符,而是整形,数据量太大,这里借用了map操作,进行简化内存:
针对这个思路程序如下:
2 #include < map >
3 using namespace std;
4
5 map < int , int > mi;
6 map < int , int > ::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 < na;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 < nb;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 < RC;i ++ )
57 {
58 cout << R[i] << " " ;
59 }
60 return 1 ;
61 }
第三题【50分】:判定德州扑克的牌型。给5张牌,返回它的牌型,4个的,3个+对子,顺子,3个+2个单张,2对,1对,其他。
德州扑克我还是很喜欢玩的,其中牌型牌型可以有近10中结果,题目仅仅让我们判断七种。但是这七种结果不具有继承性,所以我们设计一个好的程序。
那么就要统一他们的表现形式,下面是我的思路:
- 排序
- 判断跳变次数
- 进行筛选结果
这样可以较为统一的处理各种结果,参考程序如下:
2 #include < algorithm >
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 " << endl;
57 }
58 else if (n_of_v[ 0 ] == 3 && n_of_v[ 1 ] == 2 )
59 {
60 cout << " 3+2 " << endl;
61 }
62 else if (n_of_v[ 0 ] == 3 && n_of_v[ 1 ] == 1 )
63 {
64 cout << " 3+1+1 " << endl;
65 }
66 else if (n_of_v[ 0 ] == 2 && n_of_v[ 1 ] == 2 )
67 {
68 cout << " 2+2+1 " << endl;
69 }
70 else if (n_of_v[ 0 ] == 2 && n_of_v[ 1 ] == 1 )
71 {
72 cout << " 2+1+1+1 " << endl;
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 << " 不好意思,出了个顺子 " << endl;
83 }
84 else
85 cout << " 五张单牌 " << endl;
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 << " 四个一样的哦 " << endl;
104 }
105
106 return 1 ;
107 }
108 int main()
109 {
110 getType(N);
111 showResult();
112 return 1 ;
113 }
后续机试题目不断更新中~