Sobes.tech
Junior — Senior
48

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

Условие задачи

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

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

Алгоритм:

  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)