在每个数字必须是下一个/上一个数字的+3或-3的条件下,对数字数组进行混洗的最佳方法是什么?例如,0,1不能工作,但0,3可以。
谢谢!
发布于 2011-02-23 10:52:57
看一下截图,你似乎想从列表中随机选择一个类别,没有两个选择在3个以内。这段代码接受一个数组,并为您提供满足该条件的数组的子集。您也可以指定选择的最大数量,尽管您可能并不总是得到那么多。
var src = [0,1,2,3,4,5,6,7,8,9,10,11,12];
var getRnd = function(max){
var output = [];
var newSrc = src.slice();
var test, index, i, safe;
while (newSrc.length > 0 && output.length < max){
index = Math.floor(Math.random()*newSrc.length);
test = newSrc.splice(index,1);
//Make sure it's not within 3
safe = true;
for (i=0; i<output.length;i++){
if(Math.abs(test-output[i]) < 3){
//abort!
safe=false;
}
}
if(safe){
output.push(test);
}
}
return output;
};
alert(getRnd(4));发布于 2011-02-23 10:29:13
一种方法(likley,而不是fastes)将是:
我认为你可以用这个方法得到O( N*logN ) (对N* logN进行排序,并用logN为每个查询挑选N个元素)。
发布于 2011-02-23 10:37:46
假设数组中的值不能重复。
function one(array, mod){
var modArray = [];
for(var index in array){
var item = array[index];
var itemMod = item%3;
if(itemMod === mod){
modArray.push(item);
}
}
return modArray();
}
function two(modArray){
var sortedArray = // sort highest to lowest
for(var index in sortedArray ){
var item = array[index];
if(index > 0 && item[index-1] === item[index]-3){
}else{return false;}
}
return sortedArray.length;
}
function main(array){
var a1 = one(array, 0);
var a2 = one(array, 1);
var a3 = one(array, 2);
var a1c = two(a1);
var a2c = two(a2);
var a3c = two(a3);
return // if a1c is greatest then a1, if a2c greatest then a2 ... etc
}https://stackoverflow.com/questions/5086262
复制相似问题