Как среди элементов списка найти такой, чётность которого уникальна?

Дан массив, который имеет длину не менее 3, содержащий целые числа. Массив либо полностью состоит из нечетных целых чисел, либо полностью состоит из четных целых чисел, за исключением одного целого числа N.
Необходимо написать функцию, которая принимает массив в качестве аргумента и возвращает это исключение N.

Пример массивов:

[2, 4, 0, 100, 4, 11, 2602, 36] - 11
[160, 3, 1719, 19, 11, 13, -21] - 160

Код, который я реализовал:

def find_outlier(integers):
    if sum(integers) % 2 == 1: 
        return [y for y in integers if y % 2 == 1][0]
    else:
        return [x for x in integers if x % 2 == 0][0]

К сожалению, на некоторых тестах алгоритм не проходит, например:

[-9414011, 6617441, 9673581, 4326209, -2899849, 9923397, -2291281, -5434819, 8837901, 3041829, -1378743, 3743373, 3511523, 9455891, -1351663, 4948885, 5353785, 4909097, -4585903, -6153616]

Ожидалось: -6153616.
  • Вопрос задан
  • 261 просмотр
Решения вопроса 3
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Нельзя суммой проверять. Ведь если чисел в массиве четно, то сумма всегда будет нечетно (буть четным одно или n-1 в массиве).

Можно сравнить первые три числа, понять не лежит ли ваше исключение там или понять какой четности оно должно быть и дальше найти его как у вас.
Ответ написан
Комментировать
0xD34F
@0xD34F
def find_outlier(arr):
  n0, n1, n2 = [ n % 2 for n in arr[:3] ]
  return next(n for n in arr if n % 2 != n0) if n0 == n1 else arr[int(n2 == n0)]
Ответ написан
Комментировать
формируем списки где четные и не четные и берем, тот где длинна 1

d = {0: [], 1: []}

for v in [-9414011, 6617441, 9673581, 4326209, -2899849, 9923397, -2291281, -5434819, 8837901, 3041829, -1378743, 3743373, 3511523, 9455891, -1351663, 4948885, 5353785, 4909097, -4585903, -6153616]:
    d[v % 2].append(v)
    
value = d[0][0] if len(d[0]) == 1 else d[1][0]
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@alexbprofit
Junior SE
def foo(array):
  return list(filter(lambda s: s% 2 if len([el for el in array if el % 2]) == 1 else s%2 + 1,array))[0]
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы