Junior — Senior
48
Удаление первой фамилии, длина которой наиболее близка к медианному значению
Условие задачи
Дан массив строк, каждая из которых представляет ФИО человека. Необходимо определить медиану длин фамилий во всём массиве и удалить первую запись, у которой разница между длиной фамилии и найденной медианой минимальна.
Исходный массив: ["Табачник Ян Ефимович", "Черемисинов Михаил Денисович", "Бабинец Ринат Германович", "Жебраков Иван Максимович", "Перфирьев Руслан Константинович", "Муханкин Виталий Вадимович", "Цизин Ринат Валентинович", "Тинаев Виталий Викторович"]
Алгоритм:
- Для каждой строки выделить фамилию (первая часть до первого пробела).
- Посчитать длину каждой фамилии.
- Отсортировать полученные длины и найти медиану (если количество чётное — взять среднее двух центральных значений).
- Пройти по массиву в исходном порядке и вычислить абсолютную разницу между длиной фамилии текущего элемента и медианой.
- Запомнить элемент с минимальной разницей и удалить его из массива.
Результатом должна стать коллекция без найденного элемента.
Пример реализации на 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)