# 只出现一次的数字 III
---
- 剑指 Offer 56 - I. 数组中数字出现的次数
```javascript=
给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。
找出只出现一次的那两个元素。
示例 :
输入: [1,2,1,3,2,5]
输出: [3,5]
注意:
结果输出的顺序并不重要,对于上面的例子,[5, 3] 也是正确答案。
进阶:
你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?
```
:::success
```go=
// map特性, key唯一
func singleNumber(nums []int) []int {
maps := make(map[int]int, 0)
result := make([]int, 0)
count := 1
for i := 0; i < len(nums); i++ {
_, ok := maps[nums[i]]
if !ok {
maps[nums[i]] = count
} else {
maps[nums[i]] = count + 1
}
}
for key, value := range maps {
if value == 1 {
result = append(result, key)
}
}
return result
}
// 位运算
func singleNumber(nums []int) []int {
if len(nums) <= 1 {
return nums
}
if len(nums) == 2 && nums[0] != nums[1] {
return nums
}
/*
[a, c, c, d, b, d] -> c ^ c ^ d ^ d ^ a ^ b -> a ^ b
a ^ a = 0
a ^ 0 = a
因为 a, b 只出现了一次, 剩余元素都出现两次,遍历异或整个数组,只剩下 a^b且不为0
*/
resp := make([]int, 0)
result := nums[0]
for i := 1; i < len(nums); i++ {
result ^= nums[i]
}
diff := result & -result
a := 0
// 我们通过 result & (-result) 保留 result 最右边的 1,这个 1 要么来自 a,要么来自 b
for _, val := range nums {
if diff & val != 0 {
a ^= val
}
}
resp = append(resp, a)
b := result ^ a // b = a ^ b ^ a
resp = append(resp, b)
return resp
}
```
:::
###### tags: `LeeCode`