在创建具有重复整数的随机javaScript数组之后 - 避免使用相同的整数

时间:2015-04-25 21:46:04

标签: javascript arrays

对任何人有任何建议"交易"用重复整数随机填充后的数组?

这是一个简单的例子(3 x integer-group:1,2,3,4):

array[1,2,3,4,4,2,3,1,1,4,3,2];

是否有一种具有特殊功能的方式,对于" 重新排列"数组,通过避免相同的整数。

这没关系(没有直接邻居是相同的):

array[1,2,1,2,1,3,4,3,4,3,4,2];

那些不是:

array[4,4,4,1,2,3,3,2,1,1,2,3];
array[1,2,3,2,1,3,3,4,4,1,2,4];

在我的情况下,数组可以具有相同整数组的25到30倍。 希望我能宣布理解 - 所以,你了解我的问题!

提前感谢您的努力

FERO

为清晰起见编辑:

所有整数必须保守(未删除),整数可以介于0到99之间

改变"清洁"到"重新排列"

2 个答案:

答案 0 :(得分:1)

好的,既然我明白了你更好的事情 - 现在就在这里。首先,需要注意的是:有阵列,这是不可能的。例如,任何超过一半元素具有相同值的数组都不能进行混洗以保持这些值彼此远离。

那说:

var insert = function(val,arr) {
    if (arr.length > 1) {
        for (var i=1;i<arr.length;i++) {
            if (arr[i-1] !=val && arr[i] != val) {
                arr.splice(i,0,val);
                return arr;
            }
        }
    }
    arr.splice(0,0,val);
    return arr;
}

var shuffle = function(arr) {
    return arr.reduce(function(p,c,i,a) {
        return insert(c,p);
    }, []);    
}

shuffle()返回通过对输入数组的值进行混洗而构建的新数组;如果你宁愿把它们拖到适当的位置&#39;通过改变输入数组,这很容易做到。可能存在该算法失败的理论上可重排的数组。我还没有找到任何简短的测试,但我也没有证明它们不存在。

这里的算法是:

  1. 从一个空的目的地开始&#39;阵列。
  2. 对于输入数组中的每个元素,遍历目标数组并将其插入到找到的第一个位置,它不会与其邻居相等。
  3. 如果没有找到这样的位置,请将其贴在前面。
  4. (如果不忽视将东西放在第0位的可能性,这会稍微好一些)

      

    shuffle([4,4,4,3,3,3,2,2,2,1,1,1,1])= [3,1,2,1,4,1,2,1 ,3,2,4,3,4]   shuffle([1,2,3,4,4,2,3,1,1,4,3,2,2])= [2,3,2,4,2,1,3,1,4, 2,3,4,1]   shuffle([1,1,1,1,1,1,1,2,2,2,2,2,2,2])= [2,1,2,1,2,1,2,1, 2,1,2,1,2,1]

    JSfiddle

答案 1 :(得分:0)

您可以使用Array.prototype.filter()删除与相同值相邻的值。

var myArray = [1, 2, 3, 4, 4, 2, 3, 1, 1, 4, 3, 2];

var deduped = myArray.filter(function (value, index, collection) { 
    return value !== collection[index+1];
});

// deduped is now [1, 2, 3, 4, 2, 3, 1, 4, 3, 2]