# 找到出现次数奇数次的两个数

一个数组中有两个数出现了奇数次,其余数字出现了偶数次,要求找出出现奇数次的数,如下数组:

其中67,出现了奇数次,其余数字出现了偶数次,找到67即可。

# 取出最低位的1

假设我们有一个数字a,我们使a异或上a取反加1后可以得到a的二进制上最右边的1,即:rightOne = a ^ (~a + 1)

# 算法流程

  1. 遍历数组,将整个数组异或,可以得到 6 ^ 7
  2. 取到6 ^ 7 二进制最右边的那个1,我们叫它rightOne,我们可以知道67在该位置肯定不相等
  3. 利用67在该位置肯定不相等,我们遍历数组,用rightOne,去异或数组的数,如果结果不为0,我们将这些数,异或起来,最后的结果是67的其中一个,因为我们用rightOne将我们的数分成了两组,一组包含6,一组包含7
  4. 将上述结果异或6 ^ 7 可以得到另外一个数

# 代码示例

func FindTwoOddTimesNum(arr []int) (int, int) {
	eor := 0
	for _, v := range arr {
		eor ^= v
	}
	rightOne := eor&(-eor)
	eor2 := 0
	for _, v := range arr {
		if rightOne & v != 0 {
			eor2 ^= v
		}
	}
	return eor2, eor^eor2
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
上次更新: 10/2/2023,