-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path260-singleNumber.go
60 lines (53 loc) · 1.06 KB
/
260-singleNumber.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
// https://leetcode-cn.com/problems/single-number-iii/
package main
import "fmt"
/**
* 能快速想到的是用 map 做缓存
* 时间复杂度 O(n)
* 空间复杂度 O(n)
*/
func singleNumber(nums []int) []int {
m := map[int]int{}
for _, num := range nums {
m[num]++
}
ret := []int{}
for key, val := range m {
if val == 1 {
ret = append(ret, key)
}
}
return ret
}
/**
* 方法二 位运算
* 有想到异或,但具体操作还是参考官方解答
* 时间复杂度 O(n)
* 空间复杂度 O(1)
*/
func singleNumber2(nums []int) []int {
num1 := 0
for _, num := range nums {
num1 ^= num
}
lowOne := num1 & -num1
num2, num3 := 0, 0
for _, num := range nums {
if num&lowOne > 0 {
num2 ^= num
} else {
num3 ^= num
}
}
return []int{num2, num3}
}
func main() {
nums := [][]int{{1, 2, 1, 3, 2, 5}, {-1, 0}}
for _, num := range nums {
fmt.Println("ret:", singleNumber(num), singleNumber2(num))
}
x := 4
fmt.Printf("%d %b %d %b %d %b\n", x, x, -x, -x, x&-x, x&-x)
x = 7
fmt.Printf("%d %b %d %b %d %b\n", x, x, -x, -x, x&-x, x&-x)
}