如何在特定长度的数组中均匀分布元素

时间:2019-09-12 01:38:56

标签: javascript arrays algorithm sorting logic

我正在尝试从另一个长度为<我想要创建的新数组的数组中创建一个具有特定长度的数组,不仅如此,我希望元素均匀分布到数组中

示例我正在寻找的东西:

*我有:909 | 802 | 913

在长度为7的新数组中我期望什么:

909 | U | U | 802 | U | U | 913

另一个例子: *我们有:

101 | 203 | 144 | 135

长度为6期望值的数组:

101 | U | 203 | 144 | U | 135

*我们有:

909 | 802 | 913

长度为5个期望值的数组:

909 | U | 802 | U | 913

*我们有:

909 | 802 | 913

长度为8期望值的数组:

909 | U | U | 802 | U | U | U | 913

909 | U | U | U | 802 | U | U | 913可以,两个期望都是正确的

U = undefined /空

无论使用哪种语言,算法都可以,我没有问题, 代码可能是这样的:

function spreadHomogeneously(newSize: number/*must be bigger than the length of elements/numbers*/, elements: Array<number>): Array<number> /*return is a homogeneous array*/{

  //logic

}

我的尝试:

function spreadHomogeneously(newSize, elements){
  if (newSize <= elements.length){
    return elements
  }else{
    var array = new Array(newSize);
    for (i = 0; i < elements.length; i++) { 
      array[i*newSize/elements.length] = elements[i]
    }
    return array;
  }
}

console.log(spreadHomogeneously(6, [1, 3, 5]));

输出: 索引0:1

索引2:3

索引4:5

但这不是我要搜索的内容

我希望这个想法很明确, 谢谢?

1 个答案:

答案 0 :(得分:0)

您可以使用一个整数变量,该变量在原始数组的每次迭代中均以newSize-1递增。计算oldSize-1符合该值的次数:这将是将值放入新数组的索引。要对此进行校准,请让该变量以oldSize-1的一半开头,以便在上一次迭代中它将具有值(oldSize-1)/2 + (oldSize-1) * (newSize-1),该值转换为索引newSize-1,即确切地是最后一个原始值应该在哪里结束。

尝试的主要区别是-1。这是因为结果数组中第一个和最后一个值之间的索引距离不是newSize,而是newSize-1。应用于原始数组的理由相同,这意味着您必须使用oldSize-1

代码如下:

function spreadHomogeneously(newSize, elements) {
    let div = elements.length - 1;
    newSize--;
    let result = [];
    for (let i = 0, j = div>>1; i < elements.length; i++, j+=newSize) {
        result[Math.floor(j/div)] = elements[i];
    }
    return result;
}

// demo with same data (string as iterable), but increasing newSize
for (let newSize = 5; newSize < 18; newSize++) {
    console.log(JSON.stringify(spreadHomogeneously(newSize, "abcde")));
}