Функция для массива в JS
Функция должна найти минимальную сумму num элементов из значений массива array.
Пример значений переменных:
array = [2, 4, 7, 8, 1]
num = 2
Пример результата:
3
Условие:
В программе задан массив array, элементы которого имеют численное значение, и переменная num, которая является числом. Реализуйте функцию queue(num, ...array), которая принимает в качестве аргументов множество значений списка array и значение переменной num. Функция должна найти минимальную сумму num элементов из значений массива array. Ответ выведите в консоль.
Код:
const queue = (numsCount, ...arr) => {
const array = arr[0];
let nums = new Array(numsCount).fill(Infinity);
array.forEach(num => {
for (let i = 0; i < nums.length; ++i) {
if (nums[i] <= num) continue;
nums.splice(i, 0, num);
nums.pop();
break;
}
});
nums = nums.map(x => x === Infinity ? 0 : x);
const sum = nums.reduce((a, b) => a + b, 0);
console.log(sum);
}
также пробовал и:
function queue (numsCount, ...arr) {
const array = arr[0];
let nums = new Array(numsCount).fill(Infinity);
array.forEach(num => {
for (let i = 0; i < nums.length; ++i) {
if (nums[i] <= num) continue;
nums.splice(i, 0, num);
nums.pop();
break;
}
});
nums = nums.map(x => x === Infinity ? 0 : x);
const sum = nums.reduce((a, b) => a + b, 0);
console.log(sum);
}
queue(num, array) отрабатывает, а queue(num, ...array) выдает:
Uncaught TypeError: array.forEach is not a function
at queue (<anonymous>:5:9)
at <anonymous>:1:1
Ответы (2 шт):
Предлагаю такой алгоритм:
const findMinSum = (numsCount, ...arr) => {
const array = arr[0];
let nums = new Array(numsCount).fill(Infinity);
array.forEach(num => {
for (let i = 0; i < nums.length; ++i) {
if (nums[i] <= num) continue;
nums.splice(i, 0, num);
nums.pop();
break;
}
});
nums = nums.map(x => x === Infinity ? 0 : x);
const sum = nums.reduce((a, b) => a + b, 0);
return sum;
}
const array = [2, 4, 7, 8, 1];
const num = 2;
console.log(findMinSum(num, array));
И так мы заранее создаём массив нужной нам длины, заполненный значением Infinity. Выбрано это значение, т.к. любое число будет меньше чем бесконечность. Далее просто проходимся по входному массиву и смотрим между какими двумя элементами можно вставить данное число и удаляем последний элемент, т.к. после вставки размер массива увеличится на 1. Т.к. мы каждый раз вставляем в нужное место число, то отдельно сортировать массив не приходится и благдаря этому мы можем каждый раз, начинать проход с самого начала. Ну и в конце избавляемся от лишних Infinity, если они остались, конечно. Остаётся только сложить все получившиеся элементы
function queue(num, ...array) {
let sortArr = array.sort((a, b) => a - b);
let result = sortArr.reduce((acc, n) => {
if (acc.counter < num) {
acc.counter++;
acc.sum += n;
}
return acc;
}, {
counter: 0,
sum: 0
});
console.log(result.sum)
};
let array = [2, 4, 7, 8, 1];
let num = 2;
queue(num, ...array);