Удаление первой фамилии, длина которой наиболее близка к медианному значению

Медиана длин фамилий равна 7,5. Ближайшие длины — 7 и 8; первой подходящей записью является «Табачник Ян Ефимович», её и нужно удалить.

Короткий ответ

Что ответить на собеседовании

Медиана длин фамилий равна 7,5. Ближайшие длины — 7 и 8; первой подходящей записью является «Табачник Ян Ефимович», её и нужно удалить.

Подробный разбор

Ответ с пояснениями

Условие

Дан массив строк, каждая из которых представляет ФИО человека. Необходимо определить медиану длин фамилий во всём массиве и удалить первую запись, у которой разница между длиной фамилии и найденной медианой минимальна.

Исходный массив: ["Табачник Ян Ефимович", "Черемисинов Михаил Денисович", "Бабинец Ринат Германович", "Жебраков Иван Максимович", "Перфирьев Руслан Константинович", "Муханкин Виталий Вадимович", "Цизин Ринат Валентинович", "Тинаев Виталий Викторович"]

Алгоритм:

  1. Для каждой строки выделить фамилию (первая часть до первого пробела).
  2. Посчитать длину каждой фамилии.
  3. Отсортировать полученные длины и найти медиану (если количество чётное — взять среднее двух центральных значений).
  4. Пройти по массиву в исходном порядке и вычислить абсолютную разницу между длиной фамилии текущего элемента и медианой.
  5. Запомнить элемент с минимальной разницей и удалить его из массива.

Результатом должна стать коллекция без найденного элемента.

Пример реализации на Python (можно адаптировать под любой язык):

names = [
    "Табачник Ян Ефимович",
    "Черемисинов Михаил Денисович",
    "Бабинец Ринат Германович",
    "Жебраков Иван Максимович",
    "Перфирьев Руслан Константинович",
    "Муханкин Виталий Вадимович",
    "Цизин Ринат Валентинович",
    "Тинаев Виталий Викторович",
]

# шаг 1‑3
surnames = [full.split()[0] for full in names]
lengths = [len(s) for s in surnames]
sorted_lengths = sorted(lengths)
mid = len(sorted_lengths) // 2
if len(sorted_lengths) % 2:
    median = sorted_lengths[mid]
else:
    median = (sorted_lengths[mid - 1] + sorted_lengths[mid]) / 2

# шаг 4‑5
best_idx = None
best_diff = float('inf')
for i, s in enumerate(surnames):
    diff = abs(len(s) - median)
    if diff < best_diff:
        best_diff = diff
        best_idx = i

if best_idx is not None:
    del names[best_idx]

print(names)

Ответ

Медиана длин фамилий равна 7,5. Ближайшие длины — 7 и 8; первой подходящей записью является «Табачник Ян Ефимович», её и нужно удалить.

from statistics import median

def remove_nearest(names):
    if not names:
        return []
    parts = [name.split() for name in names]
    if any(not part for part in parts):
        raise ValueError('Пустое ФИО')
    lengths = [len(part[0]) for part in parts]
    middle = median(lengths)
    index = min(range(len(names)), key=lambda i: abs(lengths[i] - middle))
    return names[:index] + names[index + 1:]

min сохраняет первый индекс при равных значениях ключа, как требует условие. В отличие от примера с del, эта функция возвращает новый список. Поиск медианы через сортировку занимает O(n log n), остальные проходы — O(n).

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее