Группа массивов базируется на максимуме и длине - PullRequest
0 голосов
/ 14 февраля 2020

Трудно сгруппировать этот массив. любые предложения.

В качестве примера у меня есть массив var a = [10, 100, 20, 50, 20, 50, 70, 120]

, и у меня есть максимум 150 и минимальная длина 3, т.е. каждый суб-массив может иметь общий максимум сумма 150 и максимальная длина 3

любое предложение, чтобы сделать это так [[10, 100, 20], [50, 20, 50], [70], [120]]

заранее спасибо

1 Ответ

1 голос
/ 14 февраля 2020

Здесь вы go, функция groupArray будет перебирать ваши входные данные и строить группы на основе максимальной длины и максимальной суммы.

function groupArray(input, maxSum, maxLen) {
  const res = [[]];
  let mark = 0;
  let sum = 0;

  input.forEach( ele => {  
    // if the current group has already reach maxLenght or maxSum
    // then create a new group
    if ( res[mark].length > (maxLen-1)
        || (sum + ele) > maxSum ) {
      res.push([ele]);
      mark++;
      sum = ele;
    }
    // otherwise add to current grop
    else {
      res[mark].push(ele);
      sum += ele;
    }
  });
  return res;
}

const test_1 = [10, 100, 20, 50, 20, 50, 70, 120];
const test_2 = [10, 130, 20, 50, 20, 50, 70, 120];
const test_3 = [140, 110, 20, 50, 20, 50, 70, 120];

console.log(groupArray(test_1, 150, 3));
console.log(groupArray(test_2, 150, 3));
console.log(groupArray(test_3, 150, 3));

Примечание. Поскольку в вопросе не было каких-либо дополнительных правил, эта функция не переупорядочивает массив и не пытается найти наилучшее возможное совпадение длины или наилучшее возможное совпадение суммы.

...