Напишите функцию, которая принимает массив чисел и возвращает второе по величине число. Решение должно работать за один проход по массиву.

За один проход храните максимум и второй максимум. Сначала уточните, нужен ли второй различный элемент: для [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); исходный массив не меняется.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее