首页 新闻 会员 周边

js:求一个数字组合函数,譬如0-9这10个数字按3个3个组合,列出所有的组合,同数字不同顺序组合按一个组合算

0
悬赏园豆:50 [已解决问题] 解决于 2013-11-20 18:30

该函数接受两个参数,第一个参数 是一个数组,里面包含需要组合的数字,第二个参数是一个数字,说明按几个数字进行组合。

返回一个数组,里面是所有排列组合。

举个例子:

function group(a, b){

/*

具体代码

*/

};

希望的效果:

var r = group([1,2,3],2);

r == [[1,2],[1,3],[2,3]];

js
sc2013的主页 sc2013 | 初学一级 | 园豆:157
提问于:2013-11-20 09:34
< >
分享
最佳答案
1

我的思路是更多的使用js语言本身特性,如下:

function group(nu, groupl, result){
	
	var result = result ? result : [];
	var nul = nu.length;
	var outloopl = nul - groupl;
	
	var nuc = nu.slice(0);
	
	var item = nuc.shift();
	item = item.constructor === Array ? item : [item];
	
	
	(function func(item,nuc){
		var itemc;
		var nucc = nuc.slice(0);
		var margin = groupl- item.length
		
		
		if( margin == 0){
			result.push(item);
			return;
		}
		if( margin == 1){
			for(var j in nuc){
				itemc = item.slice(0);
				itemc.push(nuc[j]);
				result.push(itemc);
			}			
		}		
		if( margin > 1){
			itemc = item.slice(0);
			itemc.push(nucc.shift());
			func(itemc,nucc);

			if(item.length + nucc.length >= groupl){
				func(item,nucc);
			}
			
		}
		
	})(item,nuc);
	

	if(nuc.length >= groupl){
		return group(nuc, groupl, result);
	}else{
		return result;
	}
	
}

var arr = group([[1,2],3,4,5],4);
var arr2 = group([1,2,3,4],3);

收获园豆:25
Julien198414 | 菜鸟二级 |园豆:231 | 2013-11-20 18:25
其他回答(2)
0

我去,这是ACM算法题吗?试试.

<script type="text/javascript">
    function zuhe(array, num) {
        var arraySize = array.length;
        var res="";
        if (0 > num || num > arraySize) {
            return;
        }

        var loop = 0;
        var numZuhe = 0;
        var stopCondNum = 0;
        var currIdx = num - 1;
        var changeIdx = num - 1;
        var arrayIdx = new Array(array.length); //(int *)malloc(num * sizeof(int));
        var isChanged = true;

        if (null == arrayIdx) {
            return;
        }

        for (loop = 0; loop < num; ++loop) {
            arrayIdx[loop] = loop;
        }

        while (1) {
            var loop = 0;
            var stopCondNum = 0;

            if (isChanged) {
                var tem = "";
                for (loop = 0; loop < num; ++loop) {
                    tem += array[arrayIdx[loop]];
                   
                }
                ++numZuhe;
                res += "[" + tem + "]";
            }

            // 判断终止条件
            for (loop = 0; loop < num; ++loop) {
                if (arrayIdx[num - loop - 1] == arraySize - loop - 1) {
                    ++stopCondNum;
                }
                else {
                    break;
                }
            }
            if (num == stopCondNum) {
                break;
            }

            // 当前位已经达到最大值
            if (arrayIdx[currIdx] == arraySize - num + currIdx) {
                if (changeIdx == currIdx) // 是否变化到最左侧位数
                {
                    changeIdx--;
                    currIdx = num - 1;
                    arrayIdx[changeIdx] = arrayIdx[changeIdx] + 1;
                    for (loop = changeIdx + 1; loop < num; ++loop) {
                        arrayIdx[loop] = arrayIdx[loop - 1] + 1;
                    }

                    isChanged = true;
                }
                else {
                    currIdx--;

                    isChanged = false;
                }
            }
            else {
                arrayIdx[currIdx] = arrayIdx[currIdx] + 1;
                isChanged = true;
            }
        }
        return res;
    }

    alert(zuhe("1234", 2));
</script>
搞定,网上找个c++的代码帮你翻译过来的 哈哈
收获园豆:25
大芝麻 | 园豆:4 (初学一级) | 2013-11-20 09:53

谢谢同学的帮助,你的解法也可以解决问题,不过因为julien198414的解法可以支持多元数组,所以选了他的。

支持(0) 反对(0) sc2013 | 园豆:157 (初学一级) | 2013-11-20 18:34

@sc2013: julien198414  非常值得学习

支持(0) 反对(0) 大芝麻 | 园豆:4 (初学一级) | 2013-11-20 18:39

@大芝麻: 是算法的问题吗,这方法有bug

支持(0) 反对(0) miku5 | 园豆:200 (初学一级) | 2017-06-21 14:18

@大芝麻:
你的方法只有16个值,但20个值才是正确的

支持(0) 反对(0) miku5 | 园豆:200 (初学一级) | 2017-06-21 14:20

@大芝麻: 截不了图,你用group('123456',3)试试,20个才是正确的

支持(0) 反对(0) miku5 | 园豆:200 (初学一级) | 2017-06-21 14:21
0

楼上妥妥的!

幻天芒 | 园豆:37175 (高人七级) | 2013-11-20 13:23
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册