Нахождение вертикальной оси симметрии множества точек

Возможная ось проходит посередине между минимальным и максимальным 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 заранее определяют допустимую погрешность и правила сопоставления координат.

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

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

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

Подробнее