Решение задачи поиска ближайшей к нулю температуры
Что проверяют
Задача простая, поэтому смотрят не на результат, а на то, как вы к нему идёте: уточняете ли контракт до кода, выбираете ли один проход вместо сортировки и помните ли про особенности PHP при сравнении чисел. Отдельно проверяют, задаёте ли вопрос про ничью: у -1 и 1 расстояние до нуля одинаковое, и правило выбора надо согласовать, а не придумать молча.
Как отвечать
Сначала проговорите контракт: что вернуть на пустом массиве, какие числа на входе, что делать при ничье. Дальше решение за один проход, храним текущего лидера и сравниваем модули.
function closestToZero(array $temperatures): int|float
{
if ($temperatures === []) {
return 0;
}
$best = $temperatures[array_key_first($temperatures)];
foreach ($temperatures as $value) {
$cmp = abs($value) <=> abs($best);
if ($cmp < 0 || ($cmp === 0 && $value > $best)) {
$best = $value;
}
}
return $best;
}Время линейное, дополнительной памяти не требуется, входной массив не меняется. Скажите, почему не сортировка: она дороже, а usort вдобавок перепишет исходный массив. Оператор <=> здесь удобнее строгого равенства: он спокойно сравнивает int и float, тогда как === на смешанных типах вернёт ложь. Если нужен вариант короче, тот же алгоритм ложится в array_reduce.
Где спотыкаются
Инициализируют лидера значением PHP_INT_MAX или null. С null первое же сравнение через > приравнивает лидера к нулю, и отрицательные значения проигрывают на пустом месте, а с PHP_INT_MAX ломается строгое сравнение модулей, когда на входе дробные числа. Надёжнее взять первый элемент.
Молчат про ничью и про пустой вход. Собеседующий обычно и добавляет эти случаи сразу после первой версии кода, и кандидат правит уже написанное вместо того, чтобы спросить заранее.
Проверяют решение через assert(). В боевой конфигурации PHP утверждения отключены, код внутри просто не исполняется, и такие тесты всегда выглядят зелёными. Для демонстрации хватит нескольких вызовов с выводом или обычного теста в PHPUnit.