За один проход храните максимум и второй максимум. Сначала уточните, нужен ли второй различный элемент: для [5, 5, 4] ответы могут быть 4 или 5.
Напишите функцию, которая принимает массив чисел и возвращает второе по величине число. Решение должно работать за один проход по массиву.
За один проход храните максимум и второй максимум. Сначала уточните, нужен ли второй различный элемент: для [5, 5, 4] ответы могут быть 4 или 5.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
За один проход храните максимум и второй максимум. Сначала уточните, нужен ли второй различный элемент: для [5, 5, 4] ответы могут быть 4 или 5.
Вариант для второго различного конечного числа:
function secondLargest(values) {
let first;
let second;
for (const value of values) {
if (!Number.isFinite(value)) throw new TypeError('Finite numbers only');
if (first === undefined || value > first) {
second = first;
first = value;
} else if (value < first && (second === undefined || value > second)) {
second = value;
}
}
return second;
}
Если различных значений меньше двух, возвращается undefined. Время O(n), дополнительная память O(1); исходный массив не меняется.