The challenge
You are given an array (which will have a length of at least 3, but could be very large) containing integers. The array is either entirely comprised of odd integers or entirely comprised of even integers except for a single integer N
. Write a method that takes the array as an argument and returns this “outlier” N
.
Examples
[2, 4, 0, 100, 4, 11, 2602, 36]
Should return: 11 (the only odd number)
[160, 3, 1719, 19, 11, 13, -21]
Should return: 160 (the only even number)
The solution in Java
Option 1:
import java.util.Arrays;
public class FindOutlier{
static int find(int[] integers) {
int[] array = Arrays.stream(integers).filter(i -> i % 2 == 0).toArray();
return array.length == 1 ? array[0] : Arrays.stream(integers).filter(i -> i % 2 != 0).findAny().getAsInt();
}
}
Option 2:
public class FindOutlier{
static int find(int[] integers) {
int even = 0;
int odd = 0;
int cycle = 0;
for(Integer value : integers) {
if(value % 2 == 0) {
cycle++;
even = value;
}else {
odd = value;
}
}
return (cycle > 1) ? odd : even;
}
}
Option 3:
import static java.util.Arrays.stream;
public class FindOutlier {
static int find(int[] integers) {
final int p = stream(integers).limit(3).map(Math::abs).map(i -> i % 2).sum() / 2;
return stream(integers).filter(i -> Math.abs(i) % 2 != p).findFirst().getAsInt();
}
}
Test cases to validate our solution
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import org.junit.runners.JUnit4;
public class OutlierTest{
@Test
public void testExample() {
int[] exampleTest1 = {2,6,8,-10,3};
int[] exampleTest2 = {206847684,1056521,7,17,1901,21104421,7,1,35521,1,7781};
int[] exampleTest3 = {Integer.MAX_VALUE, 0, 1};
assertEquals(3, FindOutlier.find(exampleTest1));
assertEquals(206847684, FindOutlier.find(exampleTest2));
assertEquals(0, FindOutlier.find(exampleTest3));
}}