137.go 848 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. package main
  2. func singleNumberOld(nums []int) int {
  3. set := make(map[int]bool, 0)
  4. sumNums := 0
  5. for _, v := range nums {
  6. sumNums += v
  7. if !set[v] {
  8. set[v] = true
  9. }
  10. }
  11. sumSet := 0
  12. for k := range set {
  13. sumSet += k
  14. }
  15. return (sumSet*3 - sumNums) / 2
  16. }
  17. // x2 x1 x2 x1 x2 x1 x2 x1 x2 x1
  18. // 0 0 -> 0 1 -> 1 0 -> 1 1 -> 0 0
  19. // So: x1 ^= i, x2 ^= (x1 & i), ... , xn ^= (x[n-1] & ... & x1 & i)
  20. // And we need a mask to set x1~xn to 0 when counter reaches k,
  21. // which means mask == 0 only when count == k. For example, when k is 3,
  22. // mask = 11, ie. mask = !(x2 & x1)
  23. func singleNumber(nums []int) int {
  24. x2, x1, mask := 0, 0, 0
  25. for _, i := range nums {
  26. x2 ^= (x1 & i)
  27. x1 ^= i
  28. mask = ^(x2 & x1)
  29. x2 &= mask
  30. x1 &= mask
  31. }
  32. return x1
  33. }
  34. // func main() {
  35. // println(singleNumber(
  36. // []int{0, 1, 0, 1, 99, 1, 0}))
  37. // }