题目:
给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。
解法:
思想是将这两个数分开
1、对nums所有元素求异或,得到r,找到r第一个1的所在的位置,设为mask。缺失的这两个数在这个位置的取值必然不同。
2、利用mask & 1 是否为0将nums分为2部分,确实的这两个数必然处于不同的部分,而且相同的数字肯定在同一边
3、问题转换为数组中只有一个元素出现了一次,其他的元素都出现了两次。
func singleNumber(nums []int) []int {
r := 0
for i := 0; i < len(nums); i ++ {
r = r ^ nums[i]
}
cnt := 0
// r有可能是负数呀
for r != 0 {
if r & 1 != 0 {
break
}
cnt ++
r = r >> 1
}
mask := 1 << cnt
ans1 := 0
ans2 := 0
for i := 0; i < len(nums); i ++ {
if mask & nums[i] == 0 {
ans1 = ans1 ^ nums[i]
} else {
ans2 = ans2 ^ nums[i]
}
}
return []int{ans1, ans2}
}