算法-找出数组中唯一不同的数

一个数组中只有一个数是唯一的,其他数都是成对出现,找出这个唯一的数

使用异或运算

时间复杂度为o(n),空间复杂度为o(1)

两个操作数的位中,相同则结果为0,不同则结果为1。

一个数和0异或还是自己,一个数和自己异或是0。

分析:由于位运算符异或运算的特点,即两个相同的数进行异或运算时,其结果为0,所以当将数组中所有的元素进行异或运算时,其结果必定为那个唯一的数。

1
2
3
4
5
6
7
8
9
static void FindNumber(int[] array)
{
int v = 0;
for (int i = 0; i < array.Length; i++)
{
v ^= array[i];
}
Console.WriteLine("只出现一次的数是:" + v);
}

HashSet方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
static void FindNumberHashSet(int[] array)
{
HashSet<int> set = new HashSet<int>();
List<int> list = new List<int>();

foreach (var t in array)
{
if(!set.Add(t))
list.Add(t);
}

foreach (var t in set)
{
if(!list.Exists(o => o == t))
Console.WriteLine("只出现一次的数是:" + t);
}
}

一个数组中有两个数是不同的,其他数都是成对出现,找出这两个不同的数

时间复杂度为o(n),空间复杂度为o(1)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <fstream>
#include <iostream>
using namespace std;

int findFirstBit(int num)
{
int firstBit = 0;

while (((num & 1) == 0) && (firstBit < 8 * sizeof(int)))
{
num = num >> 1;
firstBit++;
}
return firstBit;
}

void findTwoDifNums(int arr[], int len, int &num1, int &num2)
{
int sum = 0;
for (int i = 0; i < len; i++)
{
sum ^= arr[i];
}

int firstBit = findFirstBit(sum);

for (int i = 0; i < len; i++)
{
int num = arr[i] >> firstBit;
if (num & 1)
{
num1 ^= arr[i];
}
else
{
num2 ^= arr[i];
}
}
}

int main()
{
int arr2[10] = {2, 3, 4, 9, 6, 4, 3, 9, 2, 8};

int num1 = 0;
int num2 = 0;

findTwoDifNums(arr2, sizeof(arr2) / sizeof(int), num1, num2);

cout << "The different two values is " << num1 << " " << num2 << endl;

getchar();

return 0;
}

参考:
找出数组中唯一不同的数