Как устроено решение задачи поиска пары чисел с заданной суммой
Что проверяют
Знаете ли вы стандартный приём с хэш-таблицей и умеете ли применить его в JavaScript без типичных для языка ловушек: объект вместо Map, сложение строк вместо чисел, разные типы в ответе. Следом просят оценить сложность и переписать решение под индексы или под поиск всех пар.
Как отвечать
Базовое решение за один проход:
- структура:
const seen = new Map(), ключ это число, значение его индекс; - цикл: для каждого элемента считаем дополнение до цели и вызываем
seen.has(complement). Нашли, возвращаем[seen.get(complement), i]. Не нашли, кладём текущее число черезseen.set(nums[i], i); - сложность: O(n) по времени в среднем и O(n) по памяти против O(n²) у двух вложенных циклов.
Почему Map, а не {}: ключи объекта всегда приводятся к строкам, у объекта есть прототип с унаследованными свойствами, а короткая проверка if (seen[complement]) ломается на индексе 0, потому что ноль ложное значение. Map хранит ключи с их типом и даёт честный has. Если нужны только значения, хватит Set.
Альтернатива: отсортировать копию массива и идти двумя указателями с краёв, это O(n log n) по времени. Важная деталь: sort() без компаратора сравнивает элементы как строки, и [10, 9, 1] станет [1, 10, 9]. Нужен числовой компаратор (a,b)=>a-b и копия через [...nums] или toSorted().
Для бэкенда на Node.js добавьте наблюдение: если числа пришли из req.query или из CSV, это строки, и "2" + "3" даст "23". Приводите вход через Number() и валидируйте его, например схемой zod, до алгоритма.
Где спотыкаются
Возвращают строку «Пара не найдена» из той же функции, что в успешном случае отдаёт массив. Вызывающему коду приходится проверять тип ответа, правильнее вернуть null.
Сортируют через nums.sort() без компаратора и без копии. Получают и неверный порядок чисел, и испорченный входной массив.
Путают порядок в паре. При проходе слева направо находка случается на втором элементе, поэтому для [4, 6] и цели 10 функция вернёт сначала 4, потом 6. Ожидаемый вывод стоит проверять запуском, а не писать по памяти.