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

其中6和7,出现了奇数次,其余数字出现了偶数次,找到6和7即可。
# 取出最低位的1
假设我们有一个数字a,我们使a异或上a取反加1后可以得到a的二进制上最右边的1,即:rightOne = a ^ (~a + 1)

# 算法流程
- 遍历数组,将整个数组异或,可以得到
6 ^ 7 - 取到
6 ^ 7二进制最右边的那个1,我们叫它rightOne,我们可以知道6和7在该位置肯定不相等 - 利用
6和7在该位置肯定不相等,我们遍历数组,用rightOne,去异或数组的数,如果结果不为0,我们将这些数,异或起来,最后的结果是6和7的其中一个,因为我们用rightOne将我们的数分成了两组,一组包含6,一组包含7 - 将上述结果异或
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
2
3
4
5
6
7
8
9
10
11
12
13
14