前端练习15 求二维数组的排列组合

题目

求出一个二维数组[[A, B], [a, b], [1, 2]]所有排列组合

输入[[A, B], [a, b], [1, 2]]

输出[Aa1, Aa2, Ab1, Ab2, Ba1, Ba2, Bb1, Bb2]

实现

编程,首先要分析规律,有了规律之后要做的就是用代码将这种规律实现就好了!!!!!

分析一下,将计算过程拆解为两两相乘的过程

  1. 首先计算[A, B] * [a, b],得到结果[Aa, Ab, Ba, Bb]
  2. 然后计算[Aa, Ab, Ba, Bb] * [1, 1],得到最终结果[Aa1, Aa2, Ab1, Ab2, Ba1, Ba2, Bb1, Bb2]
  3. 如果还有后续数组,重复上述过程

关键点就是将上面的乘法用代码表示

用递归实现,关键的计算公式是:

计算(已计算的结果 * 当前结果)

已计算的结果就是通过递归返回值,而计算单独写成一个方法,通过双层循环拼接数组成员,所以递归的架子是:

const findAll = arr => {
  if (arr.length === 1) {
    return arr[0]
  }
  const temp = arr.shift();
  return getResult(temp, findAll(arr))
};

然后实现拼接的方法:

const getResult = (arrA, arrB) => {
  if (!Array.isArray(arrA) || !Array.isArray(arrB)) {
    return
  }
  if (arrA.length === 0) {
    return arrB
  }
  if (arrB.length === 0) {
    return arrA
  }
  let result = [];
  for (let i = 0; i < arrA.length; i++) {
    for (let j = 0; j < arrB.length; j++) {
      result.push(String(arrA[i]) + String(arrB[j]))
    }
  }
  return result
};

关键还是要分析递归规律

当时在面试官的提示下,用reduce实现,也是可以的,getResult不变

const findAll = arr = > {
  return arr.reduce((total, current) = > {
    return getResult(total, current)
  }, [])
};
发布了384 篇原创文章 · 获赞 94 · 访问量 35万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览