Как найти максимальное число в массиве, которое встречается только один раз
Что проверяют
Базовую работу с частотами: видите ли вы решение за один проход вместо вложенных циклов и помните ли про крайние случаи. На позиции в данных следом почти наверняка попросят то же на pandas или NumPy и спросят, что делать, если массив не влезает в память.
Как отвечать
Решение в два шага: посчитать частоты, выбрать максимум среди встретившихся один раз.
from collections import Counter
def max_unique(arr):
cnt = Counter(arr)
return max((x for x, c in cnt.items() if c == 1), default=None)Время O(n), память O(k), где k число различных значений. Аргумент default обязателен: без него max на пустой последовательности бросает ValueError.
Альтернативы, которые стоит назвать:
- сортировка:
O(n log n), зато без словаря. Идёте с конца отсортированного массива и возвращаете первое значение, которое не совпадает с соседями; - NumPy:
vals, counts = np.unique(a, return_counts=True), затемvals[counts == 1]. Значения изnp.uniqueуже отсортированы, так что ответ это последний элемент отфильтрованного массива, если он не пуст; - pandas:
vc = s.value_counts()иvc[vc == 1].index.max(); - большие данные: в Spark
groupBy(...).count()с фильтром, в SQLGROUP BY ... HAVING count(*) = 1, затемmax.
Уточните у интервьюера, что вернуть, если уникальных нет: None, исключение или особое значение. Это решение интерфейса, угадывать его не нужно.
Где спотыкаются
Пишут arr.count(x) в цикле. Код короткий, но квадратичный, на миллионе элементов ответа не дождаться.
Инициализируют ответ нулём. На [-3, -1, -1] получится 0, которого в данных нет. Стартуйте с None или используйте max с default.
Не думают про NaN во float-данных. NaN не равен сам себе, разные NaN в словаре частот могут стать отдельными ключами, а value_counts по умолчанию их вообще отбрасывает. Заранее решите, считаются ли пропуски значениями.