该函数接受两个参数,第一个参数 是一个数组,里面包含需要组合的数字,第二个参数是一个数字,说明按几个数字进行组合。
返回一个数组,里面是所有排列组合。
举个例子:
function group(a, b){
/*
具体代码
*/
};
希望的效果:
var r = group([1,2,3],2);
r == [[1,2],[1,3],[2,3]];
我的思路是更多的使用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);
我去,这是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++的代码帮你翻译过来的 哈哈
谢谢同学的帮助,你的解法也可以解决问题,不过因为julien198414的解法可以支持多元数组,所以选了他的。
@sc2013: julien198414 非常值得学习
@大芝麻: 是算法的问题吗,这方法有bug
@大芝麻:
你的方法只有16个值,但20个值才是正确的
@大芝麻: 截不了图,你用group('123456',3)试试,20个才是正确的
楼上妥妥的!