Напишите решение задачи поиска уникального числа в массиве
Что проверяют
Знаете ли битовые операции и достаточно ли аккуратны с типами, потому что в PHP оператор ^ ведёт себя по-разному для чисел и строк. Заодно проверяют, уточните ли вы условие задачи до того, как начнёте писать.
Как отвечать
Уточните, что каждое число встречается дважды, кроме одного. Тогда свёртка через XOR решает задачу за один проход и без дополнительной памяти:
function singleNumber(array $nums): ?int
{
if ($nums === []) {
return null;
}
return array_reduce($nums, static fn (int $carry, int $n): int => $carry ^ $n, 0);
}Объясните свойство, на котором всё держится: число, применённое к себе, даёт ноль, а ноль не меняет второй операнд, поэтому пары исчезают в любом порядке. Если повторов может быть больше двух, приём не работает, и нужен подсчёт частот:
$counts = array_count_values($nums);
$single = array_search(1, $counts, true);Оговорите, что array_count_values принимает только целые и строки, array_search возвращает ключ, то есть само число, и false, если такого нет, поэтому сравнение обязано быть строгим.
Где спотыкаются
Не приводят типы. Если в массиве строки, оператор ^ выполняет побитовую операцию над строками и возвращает строку из управляющих символов, а не число. Проблема тихая: ошибки нет, просто результат бессмысленный.
Возвращают ноль на пустом массиве. Свёртка с начальным значением честно отдаёт ноль, и вызывающий код принимает его за найденное число. Пустой вход отсекается до свёртки, а тип возврата делается нулевым.
Путают задачу с array_unique. Эта функция убирает повторы и оставляет по одному экземпляру каждого числа, включая парные. Спрашивают не список без дублей, а единственный элемент, встретившийся ровно один раз, и подмена понятий здесь стоит решения.