寻找数组的最佳划分

问题描述 投票:0回答:1

我正在尝试在 Apps Script 中编写一个函数来获取大量值,我希望将这些值尽可能均匀地拆分为值的子数组(数组的数组)。 每个子数组的最佳长度为 15 个值。 每个数组中值的最大数量为 20,最小值数量为 10。

如果数组的值为 21,则将有一个 10 的数组和一个 11 的数组。22 将是两个 11 的数组。依此类推,直到达到 36 (18, 18)。 37 岁时,你会突破 (13, 13, 14)。 38 将是 (13, 14, 14)

我最初的想法是取起始数字并找到最接近的15的倍数。所以,如果数字是47,那么45就是最接近的倍数。 如果最接近的倍数小于起始数,则使用该倍数的因子,然后计算起始数与倍数之间的差。 将该数字分配给每个数组,直到达到差值总和。 所以 45 是 3 的因数。这意味着 3 个 15 的数组,那么 47 和 45 之间的差是 2。因此,在第一个数组中加 1,在第二个数组中加 1,得到 16, 16, 15。

如果最接近的倍数大于起始数,则使用较高倍数的因子,然后计算起始数与较高倍数之间的差,从每个子数组中减一,直到差值耗尽。 因此,对于 43,较高的倍数是 45 (15, 15, 15)。较高的数字之间的差是 2,因此从前两个数组中减去 1,得到 (14, 14, 15)。

到目前为止,我已经有了这个,它将告诉我每个数组应该有多少个值。 但它在数字 21 和 22 上失败。我需要一些东西来获取每个数组 X 或 Y 中的值的数量,并将 X 或 Y 值填充到该数组中。 最终输出是一个数组数组,当从左到右读取时,它会保持与原始数组相同的顺序,尽管被细分为数组。

function splitList(values) {
  const total = values.length;
  const optimalSize = 15;
  const minSize = 10;
  const maxSize = 20;

  if (total <= maxSize) {
    return [values];
  }

  let numSublists = Math.round(total / optimalSize);
  let sublistSize = Math.floor(total / numSublists);
  let remainder = total % numSublists;

  let result = [];
  let startIndex = 0;

  for (let i = 0; i < numSublists; i++) {
    let currentSize = sublistSize + (remainder > 0 ? 1 : 0);
    result.push(values.slice(startIndex, startIndex + currentSize));
    startIndex += currentSize;
    remainder--;
  }

  return result;
}

// Example usage:
const values = Array.from({
  length: 43
}, (_, i) => i + 1);
const sublists = splitList(values);
console.log(sublists);

javascript arrays google-apps-script
1个回答
0
投票

尝试将

let numSublists = Math.round(total / optimalSize);
替换为
let numSublists = Math.ceil(total / optimalSize);

© www.soinside.com 2019 - 2024. All rights reserved.