javascript - 如何将数组分成两半,直到达到一定大小的 block ?

标签 javascript arrays algorithm

我有一个可变长度的数组,该数组的长度大于 3,可以是奇数也可以是偶数。

例如:var arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', ' j'];

现在我想将该数组分成两半。

['a', 'b', 'c', 'd', 'e']['f', 'g', 'h', 'i ', 'j']

接下来我想将这些 block 分成两半并继续这样做,直到 block 的长度为 3 或 2。

最后我想将这些 block 存储在一个新数组中。

var newarr = [['a','b','c'],['d','e'],['f','g','h'],[' i','j']];

我该怎么做?

最佳答案

一种 self 暗示的方法是使用递归函数 F:对于输入数组 arr,如果其长度 <= 3,则结果为 [arr],否则为 F(first_half_of_arr)F(second_half_of_arr) 连接。

在代码中这将转换为:

function recursiveSplit(arr) { 
    return arr.length <= 3 ? [arr] : 
        recursiveSplit(arr.slice(0, Math.ceil(arr.length / 2)))
        .concat(recursiveSplit(arr.slice(Math.ceil(arr.length / 2))));
}

您可以排除 Math.ceil 调用,但如果您这样做,您将在结果中的 3 长度 block 之前获得 2 长度 block 。

现在在实践中迭代实现应该比递归实现性能更高,因为它不需要完全创建和放弃小数组,所以如果这预计在大型数组上运行也许应该远离递归。

关于javascript - 如何将数组分成两半,直到达到一定大小的 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22835296/

相关文章:

javascript - 在对象属性名称中使用变量

javascript - 如何在 1 到 100 的范围内应用 document.height/window.height 的比率。

javascript - 从嵌套值获取父对象

java - 打印排序字符串时去除重复项

javascript - JS - React - map() 方法对元素索引进行过滤(仅在索引满足条件时运行)

algorithm - 三元搜索递归不正确

javascript - 如何在没有任何循环语句的情况下获取数组中多个文件的值

algorithm - DFA运行时间不是O(n)而是O(nm)

java - 在java快速排序中添加额外的排序条件

javascript - 如何在 JS/Jquery 中组合几个 hover 元素