@rovercar

Как сделать такую функцию?

Как сделать функцию, которая принимает первым аргументом массив с целыми числами и вторым аргументом просто число. Нужно в теле функции к этом массиве найти все пары значений, которые в сумме равняются второму аргументу функции.
  • Вопрос задан
  • 325 просмотров
Решения вопроса 2
SagePtr
@SagePtr
Еда - это святое
Как-то так (в виде однострочника):
const f = (a, sum) => a.reduce((r, x, i) => r.concat(a.slice(i+1).filter(y => x + y == sum).map(y => [x, y])), [])
Но для больших объёмов данных это вряд ли будет эффективно, скорее всего, самое обычное решение с двумя вложенными циклами будет работать шустрее и менее затратно по памяти, чем в цикле гонять массив через slice/filter/map. В лоб это как-то так:
const f = (a, sum) => {
  const l = a.length;
  let r = [];
  for (let i = 0; i < l-1; i++)
    for (let j = i+1; j < l; j++)
      if (a[i] + a[j] == sum)
        r.push([a[i], a[j]]);
  return r;
}
Ответ написан
Комментировать
yanis_kondakov
@yanis_kondakov
сложность O(n)

Проходим по массиву только один раз. Для каждого элемента мы записываем разницу между текущим элементом и данной суммой и устанавливаем эту разницу как ключ в объекте. А значением для этого ключа ставим текущий элемент.

const getPairsWithSumFromArr = (arr, sum) => {
    let map = {},
         res = [];

    for (let i=0; i < arr.length; i++) {
        const currEl = arr[i];

        if (map[currEl] !== undefined) {
            res.push([map[currEl], currEl]);
        } else {
            map[sum - currEl] = currEl;
        }
    }

    return res;
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы