异或运算:相同为0,不同为1(记忆方式:无进位相加)
0^N = N
N^N = 0
a^b = b^a
(a^b)^c = a^(b^c)
同或运算:相同为1,不同为0;
1.不引入第三个变量交换两个数a,b
a =a^b
b = a^b
a = a^b
必须是两块空间,一块内存空间会有问题
其实原理就是上面红色的,b = a^(b^b) —>b= a a = a^b^a^b^b=b —>a=b
2.一个数组中有一种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这个数
[a,a,b,c,c]
eor = 0;
eor = eor^a^a^b^c^c ;
3. 将一个整形的数最右侧的1提取出来
4.一个数组中有两种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这两种数/一个数组中有一种数出现K次,其他数都出现了M次,M>1,K<M,找到出现K次的数,要求额外空间复杂度O(1),时间复杂度O(n)。
/// <summary>
/// 有两种数,出现奇数次
/// </summary>
/// <param name="arr"></param>
static void FindTwoNumberByOrder(int[] arr)
{
int eor = 0;
for (int i = 0; i < arr.Length; i++)
{
eor = eor ^ arr[i];
}
int rightOne = eor & (~eor + 1);//提取出最右的1
int eorRight = 0;
for (int i = 0; i < arr.Length; i++)
{
if((rightOne&arr[i]) != 0)
{
eorRight = eorRight ^ arr[i];
}
}
Console.WriteLine($"其中的一个数为{eorRight}");
Console.WriteLine("======================");
Console.WriteLine($"另一个数为{eor^eorRight}");
}