牛客网: BM52
题目: 数组中仅2个数字出现1次,其余出现2次
思路: 出现2次的数字异或结果为0,另外两个不同的数字异或结果res不为0,异或结果的二进制位必与其中一个相同,求出二进制位为1的pos, 遍历数组,所有此位置为1的数与异或结果再异或结果tmp即为其中一个出现1次的数字,tmp与res再异或即可得出另一个出现1次的数字。
代码:
// go
package main
// import "fmt"
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @return int整型一维数组
*/
func FindNumsAppearOnce( nums []int ) []int {
// write code here
res := nums[0]
for i := 1; i < len(nums); i++ {
res ^= nums[i]
}
pos := 0
for res >> pos > 0 {
if res >> pos & 1 == 1 {
break
} else {
pos++
}
}
tmp := res
for i := 0; i < len(nums); i++ {
if nums[i] >> pos & 1 == 1 {
tmp ^= nums[i]
}
}
res = res ^ tmp
if res > tmp {
return []int{tmp, res}
} else {
return []int{res, tmp}
}
}