寻找数组中的不同值
1 /*有一个数组,假如有一百万个数据,其中有一个的值与其他的不同。
2 如何在最短时间内将这个数据找出来
3 要求:不要开辟新的使用空间,如使用哈希表
4 不要使用判断语句,如if
5 */
6
7 #include "stdafx.h"
8
9 //不能一次异或3个,因为比较的结果为0的时候,我们不知道是diff num等于0还是3个数都相同造成的。
10 int findDiffNum2(const int a[],int n)
11 {
12 assert(n>2); //大于2
13 int i=1;
14 int x = 1;
15 while(i < n && 0==(a[i-1]^a[i]))
16 {
17 ++i; //如果n是偶数可以每次+2
18 x = -2;
19 }
20 assert(i<n);
21 //如果是开始的两个数不相等,则需要[i-1][i][i+1]异或,否则[i-2][i-1][i]
22 return a[i-1]^a[i]^a[i+x];
23 }
24
25 void testFindDiffNum()
26 {
27 int t[6]={11,12,12,12,12,12};
28 int t2[6]={7,7,0,7,7,7};
29 assert(findDiffNum2(t,6) == 11);
30 assert(findDiffNum2(t2,6) == 0);
31
32 int t3[5]={7,7,7,7,3};
33 assert(findDiffNum2(t3,5) == 3);
34 }
2 如何在最短时间内将这个数据找出来
3 要求:不要开辟新的使用空间,如使用哈希表
4 不要使用判断语句,如if
5 */
6
7 #include "stdafx.h"
8
9 //不能一次异或3个,因为比较的结果为0的时候,我们不知道是diff num等于0还是3个数都相同造成的。
10 int findDiffNum2(const int a[],int n)
11 {
12 assert(n>2); //大于2
13 int i=1;
14 int x = 1;
15 while(i < n && 0==(a[i-1]^a[i]))
16 {
17 ++i; //如果n是偶数可以每次+2
18 x = -2;
19 }
20 assert(i<n);
21 //如果是开始的两个数不相等,则需要[i-1][i][i+1]异或,否则[i-2][i-1][i]
22 return a[i-1]^a[i]^a[i+x];
23 }
24
25 void testFindDiffNum()
26 {
27 int t[6]={11,12,12,12,12,12};
28 int t2[6]={7,7,0,7,7,7};
29 assert(findDiffNum2(t,6) == 11);
30 assert(findDiffNum2(t2,6) == 0);
31
32 int t3[5]={7,7,7,7,3};
33 assert(findDiffNum2(t3,5) == 3);
34 }