| 12345678910111213141516171819202122232425262728293031323334353637383940 | 
							- package main
 
- func singleNumberOld(nums []int) int {
 
- 	set := make(map[int]bool, 0)
 
- 	sumNums := 0
 
- 	for _, v := range nums {
 
- 		sumNums += v
 
- 		if !set[v] {
 
- 			set[v] = true
 
- 		}
 
- 	}
 
- 	sumSet := 0
 
- 	for k := range set {
 
- 		sumSet += k
 
- 	}
 
- 	return (sumSet*3 - sumNums) / 2
 
- }
 
- // x2 x1   x2 x1   x2 x1   x2 x1   x2 x1
 
- //  0  0 -> 0  1 -> 1  0 -> 1  1 -> 0  0
 
- // So: x1 ^= i, x2 ^= (x1 & i), ... , xn ^= (x[n-1] & ... & x1 & i)
 
- // And we need a mask to set x1~xn to 0 when counter reaches k,
 
- // which means mask == 0 only when count == k. For example, when k is 3,
 
- // mask = 11, ie. mask = !(x2 & x1)
 
- func singleNumber(nums []int) int {
 
- 	x2, x1, mask := 0, 0, 0
 
- 	for _, i := range nums {
 
- 		x2 ^= (x1 & i)
 
- 		x1 ^= i
 
- 		mask = ^(x2 & x1)
 
- 		x2 &= mask
 
- 		x1 &= mask
 
- 	}
 
- 	return x1
 
- }
 
- // func main() {
 
- // 	println(singleNumber(
 
- // 		[]int{0, 1, 0, 1, 99, 1, 0}))
 
- // }
 
 
  |