变相进位制对不同长度的数组元素全结合
变相进位制对不同长度的数组元素全组合
原创博客,转载请注明出处。http://blog.****.net/zhouqinghe24
要求:将下列数组中各取一个元素组合所有可能的组合
{a,b,c}
{b,c}
{a,b,d,h}
将这些数组组合成一个新的数组的数组
var Arrays={{a,b,c},{b,c},{a,b,d,h}};
原创博客,转载请注明出处。http://blog.****.net/zhouqinghe24
分析:常规进位制比如 十进制、二进制、十六进制等每个数位的进制都是相同的,思及此处,楼主用了每个数位的进位制不同的方法来排列组合元素。
第一个数组 第二个数组 第三个数组 的长度分别为 3,2,4
那么索引的组合在此特例进位制中的最小值为000最大值为 213 。
即000,001,002,003,010,011,012,013,100,101,102,103,110,111,112,113,200,201,202,203,210,211,212,213
共24个
每一个组合就是以上三个数组的索引。
原创博客,转载请注明出处。http://blog.****.net/zhouqinghe24
下面写的是javascript版的代码实现。
function getDetial(Arrays) { var counts = [], result = []; for (var k = 0; k < Arrays.length; k++) { if (minArrays[k].length != 0) { counts.push(Arrays[k].length); } } var g = UnRecursive(counts);//获取索引列表 for (var i = 0; i < g.length; i++) { var ele = g[i]; var re = []; for (var j = 0; j < ele.length; j++) { re.push(Arrays[j][ele[j]]); } result.push(re); // alert(str); } return result; }
原创博客,转载请注明出处。http://blog.****.net/zhouqinghe24
function UnRecursive(Counts) { var list = []; var m_totalChips = 1; for (var i = 0; i < Counts.length; i++) { if (Counts[i] > 0) { m_totalChips *= Counts[i]; } } var nums = new Array(Counts.length); for (var x = 0; x < Counts.length; x++) { nums[x] = Counts[x] > 0 ? 0 : -1; } var last = Counts.length - 1; while (nums[last] == -1 && last != 0) { last--; } for (var j = 0; j < m_totalChips; j++) { list.push(nums.concat()); nums[last]++; for (var i = Counts.length - 1; i > 0; i--) { if (nums[i] >= Counts[i]) { nums[i] = 0; var next = i - 1; while (nums[next] == -1 && next != 0) { next--; } if (nums[i] != -1) { nums[next]++; } if (nums[0] > Counts[0]) { break; } } } } return list; }原创博客,转载请注明出处。http://blog.****.net/zhouqinghe24