异或运算:相同为0,不同为1(记忆方式:无进位相加)
0^N = N
N^N = 0
a^b = b^a
(a^b)^c = a^(b^c)
同或运算:相同为1,不同为0;

1.不引入第三个变量交换两个数a,b

  1. a =a^b
  2. b = a^b
  3. a = a^b

必须是两块空间,一块内存空间会有问题
其实原理就是上面红色的,b = a^(b^b) —>b= a a = a^b^a^b^b=b —>a=b

2.一个数组中有一种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这个数

  1. [a,a,b,c,c]
  2. eor = 0;
  3. eor = eor^a^a^b^c^c ;

3. 将一个整形的数最右侧的1提取出来

a&(-a) a&(~a+1)
-a就是a取反+1

4.一个数组中有两种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这两种数/一个数组中有一种数出现K次,其他数都出现了M次,M>1,K<M,找到出现K次的数,要求额外空间复杂度O(1),时间复杂度O(n)。

  1. /// <summary>
  2. /// 有两种数,出现奇数次
  3. /// </summary>
  4. /// <param name="arr"></param>
  5. static void FindTwoNumberByOrder(int[] arr)
  6. {
  7. int eor = 0;
  8. for (int i = 0; i < arr.Length; i++)
  9. {
  10. eor = eor ^ arr[i];
  11. }
  12. int rightOne = eor & (~eor + 1);//提取出最右的1
  13. int eorRight = 0;
  14. for (int i = 0; i < arr.Length; i++)
  15. {
  16. if((rightOne&arr[i]) != 0)
  17. {
  18. eorRight = eorRight ^ arr[i];
  19. }
  20. }
  21. Console.WriteLine($"其中的一个数为{eorRight}");
  22. Console.WriteLine("======================");
  23. Console.WriteLine($"另一个数为{eor^eorRight}");
  24. }

5. 一个数组中只有一种数出现K次,其他数都出现了M次,M>1,K<M,找到出现K次的数,要求额外空间复杂度O(1),时间复杂度O(n)。