DEV Community

Lancelot03
Lancelot03

Posted on

Find The Parity Outlier

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)
Enter fullscreen mode Exit fullscreen mode

Sample Tests

test.assert_equals(find_outlier([2, 4, 6, 8, 10, 3]), 3)
test.assert_equals(find_outlier([2, 4, 0, 100, 4, 11, 2602, 36]), 11)
test.assert_equals(find_outlier([160, 3, 1719, 19, 11, 13, -21]), 160)
Enter fullscreen mode Exit fullscreen mode

Solution- ###Python

def find_outlier(integers):
    even=[]
    odd=[]
    for i in integers:
        if i % 2 == 0:
            even.append(i)
        else:
            odd.append(i)
    if len(even)==1:
        return even[0]
    else:
        return odd[0]
Enter fullscreen mode Exit fullscreen mode

Discussion (1)

Collapse
sophist profile image
Sophist • Edited on

In principle (subject to edge case below), how about:

def find_outlier(integers):
    remainder = integers[0] % 2
    for i in integers:
        if i % 2 != remainder:
            return i
Enter fullscreen mode Exit fullscreen mode

This will, however, not handle the edge case where the outlier is the first item in the array. So...

def find_outlier(integers):
    test = integers[0:3]
    triple = sum(map(lambda x: x % 2, test))
    if triple % 3: # outlier in first 3
        remainder = 1 - triple % 2
    else:
        remainder = triple % 2
        test = integers[3:]
    for i in test:
        if i % 2 != remainder:
            return i
Enter fullscreen mode Exit fullscreen mode