The challenge

You will be given an array of integers whose elements have both a negative and a positive value, except for one integer that is either only negative or only positive. Your task will be to find that integer.

Examples:

[1, -1, 2, -2, 3] => 3

3 has no matching negative appearance

[-3, 1, 2, 3, -1, -4, -2] => -4

-4 has no matching positive appearance

[1, -1, 2, -2, 3, 3] => 3

(the only-positive or only-negative integer may appear more than once)

The solution in Golang

Option 1:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
package solution 

func Solve(arr []int) int {
  hash := make(map[int]bool)
  ans := 0
  for _, entry := range arr {
    if _, value := hash[entry]; !value {
      hash[entry] = true
      ans += entry
    }
  }
  return ans
}

Option 2:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
package solution 

func Solve(a []int) int {
  s, n := 0, 0
  for _, v := range a {
    s += v
    if v < 0 { n-- } else { n++ }
  }
  if n < 0 { n = -n }
  return s/n
}

Option 3:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
package solution

func Find(arr []int, elem int) bool {
    for _, x := range arr {
        if elem == x {
           return true
        }
    }
    return false
}

func Solve(arr []int) int {
    for _, x := range arr {
        if !Find(arr, -x) {
            return x
        }
    }
    return 0
}

Test cases to validate our solution

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
package solution_test
import (
  . "github.com/onsi/ginkgo"
  . "github.com/onsi/gomega"
)

func dotest(arr []int, exp int) {
    var ans = Solve(arr)
    Expect(ans).To(Equal(exp))
}

var _ = Describe("Example tests", func() {
  It("It should work for basic tests", func() {       
        dotest([] int{1,-1,2,-2,3}, 3)
        dotest([] int{-3,1,2,3,-1,-4,-2}, -4)      
        dotest([] int{1,-1,2,-2,3,3}, 3)
        dotest([] int{-110,110,-38,-38,-62,62,-38,-38,-38}, -38)
        dotest([] int{-9,-105,-9,-9,-9,-9,105}, -9)       
  })
})