牛客网: 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}
- }
- }