The challenge
There is an array with some numbers. All numbers are equal except for one. Try to find it!
Solution.findUniq(new double[]{ 1, 1, 1, 2, 1, 1 }); // => 2 Solution.findUniq(new double[]{ 0, 0, 0.55, 0, 0 }); // => 0.55
It’s guaranteed that array contains at least 3 numbers.
The tests contain some very huge arrays, so think about performance.
The solution in Java code
Option 1:
import java.util.Arrays; public class Solution { public static double findUniq(double[] arr) { Arrays.sort(arr); return arr[0] == arr[1] ? arr[arr.length-1]:arr[0]; } }
Option 2:
public class Solution { public static double findUniq(double arr[]) { final double x = arr[arr[0] == arr[1] ? 0 : 2]; for (double y : arr) if (y != x) return y; throw new RuntimeException("no unique number found"); } }
Option 3:
import java.util.Arrays; import java.util.Map.Entry; import static java.util.function.Function.identity; import static java.util.stream.Collectors.counting; import static java.util.stream.Collectors.groupingBy; class Solution { static double findUniq(final double[] array) { return Arrays.stream(array).boxed() .collect(groupingBy(identity(), counting())) .entrySet().stream() .filter(e -> e.getValue() == 1) .findFirst() .map(Entry::getKey) .orElse(0.0); } }
Test cases to validate our solution
import org.junit.Test; import static org.junit.Assert.assertEquals; import org.junit.runners.JUnit4; public class FindUniqTest { private double precision = 0.0000000000001; @Test public void sampleTestCases() { assertEquals(1.0, Solution.findUniq(new double[]{0, 1, 0}), precision); assertEquals(2.0, Solution.findUniq(new double[]{1, 1, 1, 2, 1, 1}), precision); } }