260.只出现一次的数字III
260.只出现一次的数字III
题解
具体思路就是想办法将数组逻辑上一分为二!先异或一遍到最后得到一个数,得到的肯定是a ^ b(假设两个数值分别为a和b)的值。在看异或^的属性:不同为1,相同为0. 也就是说最终这个结果的二进制为1的位置上a和b是不相同的。而我们可以找到这个第一个不同的位,然后将数组中的数分成两份,该位为0的进行异或求解得到其中一个结果a,该位为1的进行异或求解得到另一个结果b。
代码
package main func singleNumber(nums []int) []int { xor := 0 for i := 0; i < len(nums); i++ { xor ^= nums[i]//出现两次的数都抵消了,所以xor为两个出现一次的数的异或 } result := []int{xor, xor} //找到末尾的1,异或出1,假设a,b,说明a,b其中一个在位上为0 diff := (xor & (xor - 1)) ^ xor for i := 0; i < len(nums); i++ { if diff&nums[i] == 0 {//找到该位为0的数进行异或,出现两次的数都抵消了 result[0] ^= nums[i] } else { result[1] ^= nums[i] } } return result }