Как реализовать проверку ключей с отрицательными и совпадающими значениями для зеркальных точек
Что проверяют
Формулировка размыта, и первое, что оценивают, это умение уточнить задачу, а не бросаться писать код. Дальше смотрят, выберете ли вы хэш-структуру вместо вложенного цикла и вспомните ли про ноль и повторы. Следом часто просят то же самое на pandas или для точек на плоскости.
Как отвечать
Проговорите трактовку: зеркальная пара это значения x и -x, либо точки, симметричные относительно вертикальной прямой. Каркас решения:
- множество ключей:
seen = set(values), проверка-x in seenза O(1), всё решение O(n) вместо O(n²) у двойного цикла; - ноль: он зеркален сам себе. Договоритесь, считается ли одиночный
0парой, и если нет, проверяйте поCounter, что он встречается минимум дважды; - повторы: решите, нужны уникальные пары или все вхождения. Для уникальных берите только
x > 0, иначе пара попадёт в ответ дважды, как(1, -1)и(-1, 1); - точки на плоскости: ось симметрии проходит посередине между минимальным и максимальным
x. Чтобы не связываться с дробями, хранитеs = min_x + max_xи проверяйте, что для каждой(x, y)в множестве есть(s - x, y); - табличные данные: в
pandasэтоdf["x"].isin(-df["x"])для одномерного случая илиmergeтаблицы с самой собой по вычисленному зеркальному ключу.
Назовите цену: множество занимает O(n) памяти. Если данные не помещаются в память, то же самое делается джойном в Spark или SQL.
Где спотыкаются
Начинают писать код, не уточнив, что такое «зеркальная точка». Потом решение отвечает на другую задачу, и его приходится переписывать на глазах у интервьюера.
Забывают про ноль: одиночный 0 находит в множестве сам себя и попадает в ответ как пара.
Возвращают обе стороны пары, словарь вида {1: -1, -1: 1}, и не замечают удвоения. В аналитике это превращается в завышенные счётчики и дубли в отчёте.