1、 找到数组中只出现一次的数字,其余数字出现两次
思路:我们知道在二进制中,两个数在进行异或运算时会得到0 即 。 所以,数组中所有值的异或结果为只出现一次的数字
// nums = []int{1,1,2,2,3,3,4}
nums := []int{1,1,2,2,3,3,4}
var rst int
for _,num := range nums {
rst ^= nums
}
//.....
2、 某个数组中,只有一个数字出现1次,其余数字出现n次(这里以3次为例)
思路:我们可以计算每一位上1的个数,1个个数可能会有3种情况:1\n\n+1。所以我们只要求出每位上1个数对n取余即可
// nums := []int{1,1,1,2,2,2,3,3,3,4}
nums := []int{1,1,1,2,2,2,3,3,3,4}
var ans int32
for i := 0;i<32;i++{
cnt := 0
for _,num := range nums {
cnt += int32(num) >> i & 1
}
ans |= (cnt % 3) << i
}