带填充的Javascript数组洗牌
在每个数字必须是下一个/上一个数字的+3或-3的条件下,洗牌一个数字数组的最佳方法是什么?例如,[0,1]不起作用,但[0,3]起作用 谢谢 一种方法(比如说斋戒)是:带填充的Javascript数组洗牌,javascript,Javascript,在每个数字必须是下一个/上一个数字的+3或-3的条件下,洗牌一个数字数组的最佳方法是什么?例如,[0,1]不起作用,但[0,3]起作用 谢谢 一种方法(比如说斋戒)是: 排序数组 拾取随机元素以启动新的无序数组(将排序数组中的元素标记为已使用或移除) 使用二进制搜索查找下一个元素,即最后一个元素的+3或-3(在-3和+3之间随机选择)。确保元素未标记为以前使用过(否则请查找另一个) 重复3次,直到找到元素 您要么从已排序数组中拾取所有元素,要么不可能进行这种洗牌 我认为这样可以得到O(N*log
我认为这样可以得到O(N*logN)(对N*logN进行排序,并用logN为每个serch选取N个元素)。假设数组中的值不能重复
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
}
我想你一定是以某种非标准的方式使用了“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]
感觉这可能是图论中一个已解决的问题—某种具有最大/最小代价函数的网络遍历。查看屏幕截图,您似乎想从列表中随机选择一个组合,没有两个选择在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));
var src=[0,1,2,3,4,5,6,7,8,9,10,11,12];
var getRnd=函数(最大值){
var输出=[];
var newSrc=src.slice();
var检验,指数,i,安全;
而(newSrc.length>0&&output.length 对于(i=0;iIt不总是可能的——你给出一个不可能的例子。一般来说,你不会总是能够做到。你试图解决的根本问题是什么?是的,我知道这不总是可能的。基本上,我正在尝试建立一个“图像网格”这会突出显示随机图像--它会循环--突出显示的图像有一个标签,如果它们太近,会覆盖其他图像--请查看此屏幕截图(可能比尝试解释要好),这正是我想要做的。谢谢!