首页 > 解决方案 > 将数组分成 n 块,起始元素重叠

问题描述

我有以下问题,我需要将一个数组分成至少 n 个偶数块,但是每个数组的第一个元素除了第一个元素是前一个数组的最后一个元素。如果没有足够的元素,最后一个数组可以包含较少数量的元素。

由 ~ @trincot 发现的边缘案例

如果无法拆分为 n 个请求的块,则在可能的情况下拆分为最接近的块数。

输入:

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]

预期输出 n=3:

[[1, 2, 3, 4, 5], [5, 6, 8, 9, 10], [10, 11]]

我需要 JavaScript 的解决方案,但可以随意提交其他语言,我将翻译它并用 JavaScript 提交解决方案。

我不工作的尝试,我无法弄清楚如何从所需的块号开始,所以我在这里使用了块大小,打算稍后从块号中找出块大小。

let array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
const range = 4;
const res = [array.slice(0, range)];

let start = range;
let end = range * 2;
while (true) {
  console.log(start, end);
  res.push(array.slice(start, end));
  start += range;
  end += range;
  if (start >= array.length) {
    break;
  }
}

console.log(res);

标签: javascriptarraysalgorithm

解决方案


这是一个产生结果的映射函数:

const overlapSplit = (arr, length) => {
    let chunk = 1 + Math.max(1, Math.ceil((arr.length - 1) / length));
    if (length > 1 && (chunk - 1) * (length - 1) + 1 > arr.length) return overlapSplit(arr, length - 1);
    return Array.from({length}, (_, i) =>
        arr.slice(i * chunk - i, i * chunk - i + chunk)
    );
}  

console.log(overlapSplit([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13], 6));


推荐阅读