在每个数字必须是下一个/上一个数字的+3或-3的条件下,对数组进行洗牌的最佳方法是什么?因此,例如[0,1]不起作用,但[0,3]会起作用。
谢谢!
答案 0 :(得分:1)
看一下截图,你似乎想要从列表中选择一个随机分类,没有2个选择在彼此的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));
答案 1 :(得分:0)
一种方式(不是紧张的方式)将是:
我认为你得到O(N * logN)(排序N * logN并为每个serch选择带有logN的N个元素)。
答案 2 :(得分:0)
假设数组中的值不能重复。
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
}
答案 3 :(得分:0)
我认为你必须以某种非标准的方式使用短语“shuffle”。如果所有数字都已经在彼此的+ -3范围内,那么排序数组会将它们按正确的顺序排列,除非有重复数据,我猜。
更多示例可能会有所帮助。例如,这些例子是否有效,以及您正在寻找的那种东西?
[0, 3, 3] -> [3, 0, 3]
[9, 3, 6, 0, 6] -> [0, 3, 6, 9, 6]
[3, 3, 6, 0, 6] -> [0, 3, 6, 3, 6]
感觉这可能是图论中解决的问题 - 某种网络遍历具有最大/最小成本函数。