Как написать функцию для вычисления минимального, максимального возраста и их разницы в массиве
Что проверяют
Не знание Math.min, а внимание к краевым случаям и форме данных: пустой массив, мусор во входе, объекты вместо чисел, большие массивы. Следом часто просят вернуть не только числа, но и самих людей с крайним возрастом или переписать решение на TypeScript.
Как отвечать
Сначала уточните контракт: что приходит, числа или объекты вида { name, age }, и что делать с пустым массивом, бросать ошибку или возвращать null. Потом дайте решение за один проход:
- один цикл: берёте
minиmaxиз первого элемента и идётеfor...ofпо остальным. O(n) по времени, O(1) по памяти, работает на массиве любого размера; Math.min(...ages): короче и годится для небольших массивов, но spread превращает массив в аргументы функции. На сотнях тысяч элементов это падает сRangeError, потому что у числа аргументов есть предел.Math.min.applyупирается в него же;- пустой массив:
Math.min()без аргументов возвращаетInfinity,Math.max()возвращает-Infinity, и разница выйдет-Infinityбез всякой ошибки. Проверка длины обязательна; - валидация:
Number.isFinite(age)отсекаетNaN,undefinedи строки. Без неёMath.minприведёт"30"к числу, а"abc"превратит весь результат вNaN; - результат: объект
{ min, max, diff }, в TypeScript с явным типом возвратаAgeStats | null.
Если данные приходят объектами, не делайте users.map(u => u.age) и лишний проход: в том же цикле держите ссылки на самого младшего и самого старшего, это сразу закрывает типичное продолжение.
Назовите тесты: пустой массив, один элемент (разница 0), все одинаковые, NaN или отрицательное число во входе.
Где спотыкаются
Пишут Math.min(...ages) и не знают о пределе числа аргументов. Интервьюер нарочно спросит про миллион элементов.
Не обрабатывают пустой массив и получают -Infinity в интерфейсе, откуда он потом приходит баг-репортом.
Сортируют массив ради двух значений. Это O(n log n) вместо O(n), sort() меняет исходный массив, а без компаратора сравнивает числа как строки: [5, 30, 100] превращается в [100, 30, 5].