首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用填充的Javascript数组混洗

使用填充的Javascript数组混洗
EN

Stack Overflow用户
提问于 2011-02-23 10:07:16
回答 4查看 5.2K关注 0票数 1

在每个数字必须是下一个/上一个数字的+3或-3的条件下,对数字数组进行混洗的最佳方法是什么?例如,0,1不能工作,但0,3可以。

谢谢!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-02-23 10:52:57

看一下截图,你似乎想从列表中随机选择一个类别,没有两个选择在3个以内。这段代码接受一个数组,并为您提供满足该条件的数组的子集。您也可以指定选择的最大数量,尽管您可能并不总是得到那么多。

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2011-02-23 10:29:13

一种方法(likley,而不是fastes)将是:

  1. 排序数组
  2. 选取随机元素开始新的随机数组(将排序数组中的元素标记为已使用或删除)
  3. 使用二进制搜索查找下一个元素,该元素为+3或-3 (在-3和+3之间随机选择)。确保元素未标记为以前使用过(否则请查找其他元素)
  4. 重复3,直到您可以找到元素。
  5. 您从排序的数组中选取了所有元素,或者无法进行这种混洗。

我认为你可以用这个方法得到O( N*logN ) (对N* logN进行排序,并用logN为每个查询挑选N个元素)。

票数 0
EN

Stack Overflow用户

发布于 2011-02-23 10:37:46

假设数组中的值不能重复。

代码语言:javascript
运行
复制
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
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5086262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档