N个不定长度的数组输出全部元素的组合与全排列算法

N个不定长度的数组输出全部元素的组合

    let list = [[1, 2, 3], ['a', 'b', 'c'], ['d', 'e']]
    function getCombination(array) {
      let resultArr = []
      array.forEach((arrItem) => {
        if (resultArr.length === 0) {
          let firstItem = []
          arrItem.forEach(item => {
            firstItem.push(item)
          })
          resultArr = firstItem
        } else {
          const emptyArray = []
          resultArr.forEach((item) => {
            arrItem.forEach((value) => {
              emptyArray.push(item + value)
            })
          })
          resultArr = emptyArray
        }
      })
      return resultArr
    }
    console.log(getCombination(list))


结果:
0: “1ad”
1: “1ae”
2: “1bd”
3: “1be”
4: “1cd”
5: “1ce”
6: “2ad”
7: “2ae”
8: “2bd”
9: “2be”
10: “2cd”
11: “2ce”
12: “3ad”
13: “3ae”
14: “3bd”
15: “3be”
16: “3cd”
17: “3ce”

全排列算法

    // 数组全排列
    let func = (arr) => {
      let len = arr.length
      let res = [] // 所有排列结果
      /**
       * 【全排列算法】
       * 说明:arrange用来对arr中的元素进行排列组合,将排列好的各个结果存在新数组中
       * @param tempArr:排列好的元素
       * @param leftArr:待排列元素
       */
      let arrange = (tempArr, leftArr) => {
        if (tempArr.length === len) { // 这里就是递归结束的地方
          // res.push(tempArr) // 得到全排列的每个元素都是数组
          res.push(tempArr.join('')) // 得到全排列的每个元素都是字符串
        } else {
          leftArr.forEach((item, index) => {
            let temp = [].concat(leftArr)
            temp.splice(index, 1)
            // 此时,第一个参数是当前分离出的元素所在数组;第二个参数temp是传入的leftArr去掉第一个后的结果
            arrange(tempArr.concat(item), temp) // 这里使用了递归
          })
        }
      }
      arrange([], arr)
      return res
    }
    console.log('结果:', func(['A', 'B', 'C', 'D']))

结果:
0: “ABCD”
1: “ABDC”
2: “ACBD”
3: “ACDB”
4: “ADBC”
5: “ADCB”
6: “BACD”
7: “BADC”
8: “BCAD”
9: “BCDA”
10: “BDAC”
11: “BDCA”
12: “CABD”
13: “CADB”
14: “CBAD”
15: “CBDA”
16: “CDAB”
17: “CDBA”
18: “DABC”
19: “DACB”
20: “DBAC”
21: “DBCA”
22: “DCAB”
23: “DCBA”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值