java 二维数组排列组合_js多个(N)个数组的的元素组合排序算法,多维数组的排列组合或多个数组之间的排列组合...

现在有一批手机,其中颜色有[‘白色‘,‘黑色‘,‘金色‘,‘粉红色‘];内存大小有[‘16G‘,‘32G‘,‘64G‘,‘128G‘],版本有[‘移动‘,‘联通‘,‘电信‘],要求写一个算法,实现[[‘白色‘,‘16G‘,‘移动‘], [‘白色‘,‘16G‘,‘联通‘] ...]这样的组合,扩张,如果后面还有参数,比如再加一个[‘国行‘,‘港版‘,‘美版‘],不改程序一样可以执行!

通过上面规律可以发现这个算法就是:一个数组里面包含若干个数组,进行组合

算法代码写法一:

// 执行组合排列的函数

function doExchange(array){

var len = arr.length;

// 当数组大于等于2个的时候

if(len >= 2){

// 第一个数组的长度

var len1 = arr[0].length;

// 第二个数组的长度

var len2 = arr[1].length;

// 2个数组产生的组合数

var lenBoth = len1 * len2;

// 申明一个新数组,做数据暂存

var items = new Array(lenBoth);

// 申明新数组的索引

var index = 0;

// 2层嵌套循环,将组合放到新数组中

for(var i=0; i

for(var j=0; j

items[index] = arr[0][i] +"|"+ arr[1][j];

index++;

}

}

// 将新组合的数组并到原数组中

var newArr = new Array(len -1);

for(var i=2;i

newArr[i-1] = arr[i];

}

newArr[0] = items;

// 执行回调

return doExchange(newArr);

}else{

return arr[0];

}

}

//执行

var array = [[‘a‘, ‘b‘, ‘c‘], [1, 2, 3], [‘x‘, ‘y‘, ‘z‘]];

var arr1 = [[‘a‘,‘b‘,‘c‘]];

console.log(doExchange(array));

写法二:

function doExchange(arr, depth)

{

for (var i = 0; i < arr[depth].length; i++) {

result[depth] = arr[depth][i]

if (depth != arr.length - 1) {

doExchange(arr, depth + 1)

} else {

results.push(result.join(‘|‘))

}

}

}

function test(arr)

{

results = [];

result = [];

doExchange(arr, 0);

console.log(results.length, results.join(‘,‘));

}

garr = [

[‘a‘, ‘b‘, ‘c‘],

[‘1‘, ‘2‘, ‘3‘],

[‘x‘, ‘y‘, ‘z‘],

]

test(garr)

可能也会有类似的需求,但是我们今天要讲的不是这样的需求,而是里面的每一个组合要是一个数组:

/*返回组合的数组*/function doExchange(array){

var len = arr.length;

// 当数组大于等于2个的时候

if(len >= 2){

// 第一个数组的长度

var len1 = arr[0].length;

// 第二个数组的长度

var len2 = arr[1].length;

// 2个数组产生的组合数

var lenBoth = len1 * len2;

// 申明一个新数组

var items = new Array(lenBoth);

// 申明新数组的索引

var index = 0;

for(var i=0; i

for(var j=0; j

if(arr[0][i] instanceof Array){

items[index] = arr[0][i].concat(arr[1][j]);

}else{

items[index] = [arr[0][i]].concat(arr[1][j]);

}

index++;

}

}

var newArr = new Array(len -1);

for(var i=2;i

newArr[i-1] = arr[i];

}

newArr[0] = items;

return doExchange(newArr);

}else{

return arr[0];

}

}

//

var arr = [[‘a‘, ‘b‘, ‘c‘,‘d‘], [1, 2, 3,4], [‘x‘, ‘y‘, ‘z‘],[‘魅族手机‘]];

console.log(doExchange(arr));

时间: 05-12

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值