Возможная ось проходит посередине между минимальным и максимальным x. Проверьте наличие отражения каждой точки с той же кратностью.
Нахождение вертикальной оси симметрии множества точек
Возможная ось проходит посередине между минимальным и максимальным x. Проверьте наличие отражения каждой точки с той же кратностью.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Дан набор точек на двумерной плоскости (список пар координат). Требуется определить, существует ли вертикальная прямая, относительно которой набор точек симметричен, и если такая прямая есть, вернуть её абсциссу.
def symmetry():
pass
Пример использования:
- points = [(-4, 2), (4, 2), (3, 3), (-3, 3)] → результат: 0
- points = [(-4, 2), (4, 3), (3, 3), (-3, 3)] → результат: None
Ответ
Возможная ось проходит посередине между минимальным и максимальным x. Проверьте наличие отражения каждой точки с той же кратностью.
Для целочисленных координат сравнение можно выполнить точно, не вычисляя дробные отражения:
from collections import Counter
from fractions import Fraction
def symmetry(points):
if not points:
return Fraction(0) # Для пустого набора подходит любая ось.
counts = Counter(map(tuple, points))
axis_sum = min(x for x, y in counts) + max(x for x, y in counts)
for (x, y), count in counts.items():
if counts[(axis_sum - x, y)] != count:
return None
return Fraction(axis_sum, 2)
Счётчик сохраняет повторяющиеся точки; для математического множества можно использовать set. Алгоритм требует ожидаемо O(n) времени и O(n) памяти. Для неточных float заранее определяют допустимую погрешность и правила сопоставления координат.