func test(nums []int) []int {
tmp := 0
for _, num := range nums {
tmp ^= num
}
index := 0 // 找到tmp的哪一位不为0 ,表明可以用这一位把数组分成两个数组
for ; index < 32; index++ {
if tmp&(1<<index) != 0 {
break
}
}
ans := []int{0, 0}
for _, num := range nums {
if (num>>index)&1 != 0 {
ans[0] ^= num
continue
} else {
ans[1] ^= num
}
}
return ans
}
思路
1 将所有数异或,出现两次的被抵消,最后的结果是两个只出现一次的数异或结果tmp 2 把第一步的tmp的每一位遍历,找到两个只出现一次的数在哪一位不一样 3 通过这一位将数组分成两个数组来异或 4 注意运算优先级