请教一道算法题?

有以下数据:

const labels = [
  ["红色", "黄色", "蓝色"],
  ["8g", "12g", "16g", "24g"],
  ["小米10", "小米11", "小米12", "小米13"],
  ["pro", "plus"],
  // 后续N个参数列表
  ...
];

要求是,将所有项按顺序一一组合,如 红色8g小米10pro,红色8g小米10plus,红色8g小米11pro,红色8g小米11plus,...

以下是我的暴力解法

const combination = labels.reduce((result, item) => {
  if (!result.length) {
    result = [...item];
  } else {
    result = connect(result, item);
  }
  return result;
}, []);

function connect(s1, s2) {
  const c = [];
  s1.forEach(_s1 => {
    s2.forEach(_s2 => {
      c.push(_s1 + _s2);
    });
  });
  return c;
};

再者,不按顺序又该如何解

阅读 1.4k
2 个回答

你解法已经很好了,对于不按顺序组合的问题,你可以用递归的方法来实现:

function cartesianProduct(labels, index = 0, current = '') {
  if (index === labels.length) {
    return [current];
  }

  let result = [];
  for (const item of labels[index]) {
    result = result.concat(cartesianProduct(labels, index + 1, current + item));
  }
  return result;
}

const labels = [
  ["红色", "黄色", "蓝色"],
  ["8g", "12g", "16g", "24g"],
  ["小米10", "小米11", "小米12", "小米13"],
  ["pro", "plus"],
  // 后续N个参数列表
  ...
];

const combinations = cartesianProduct(labels);
console.log(combinations);
const labels = [
  ["红色", "黄色", "蓝色"],
  ["8g", "12g", "16g", "24g"],
  ["小米10", "小米11", "小米12", "小米13"],
  ["pro", "plus"],
  // 后续N个参数列表
  // ...
];

function comb(arr1, arr2) {
    var res = []
    for(var it1 of arr1){
        for(var it2 of arr2){
            res.push(it1 + it2)
        }
    }
    return res
}

var res = [""]

for (var l of labels) {
    res = comb(res, l)
}

console.log(res)
// ['红色8g小米10pro', '红色8g小米10plus', '红色8g小米11pro', '红色8g小米11plus', '红色8g小米12pro', '红色8g小米12plus', '红色8g小米13pro', '红色8g小米13plus', '红色12g小米10pro', '红色12g小米10plus', '红色12g小米11pro', '红色12g小米11plus', '红色12g小米12pro', '红色12g小米12plus', '红色12g小米13pro', '红色12g小米13plus', '红色16g小米10pro', '红色16g小米10plus', '红色16g小米11pro', '红色16g小米11plus', '红色16g小米12pro', '红色16g小米12plus', '红色16g小米13pro', '红色16g小米13plus', '红色24g小米10pro', '红色24g小米10plus', '红色24g小米11pro', '红色24g小米11plus', '红色24g小米12pro', '红色24g小米12plus', '红色24g小米13pro', '红色24g小米13plus', '黄色8g小米10pro', '黄色8g小米10plus', '黄色8g小米11pro', '黄色8g小米11plus', '黄色8g小米12pro', '黄色8g小米12plus', '黄色8g小米13pro', '黄色8g小米13plus', '黄色12g小米10pro', '黄色12g小米10plus', '黄色12g小米11pro', '黄色12g小米11plus', '黄色12g小米12pro', '黄色12g小米12plus', '黄色12g小米13pro', '黄色12g小米13plus', '黄色16g小米10pro', '黄色16g小米10plus', '黄色16g小米11pro', '黄色16g小米11plus', '黄色16g小米12pro', '黄色16g小米12plus', '黄色16g小米13pro', '黄色16g小米13plus', '黄色24g小米10pro', '黄色24g小米10plus', '黄色24g小米11pro', '黄色24g小米11plus', '黄色24g小米12pro', '黄色24g小米12plus', '黄色24g小米13pro', '黄色24g小米13plus', '蓝色8g小米10pro', '蓝色8g小米10plus', '蓝色8g小米11pro', '蓝色8g小米11plus', '蓝色8g小米12pro', '蓝色8g小米12plus', '蓝色8g小米13pro', '蓝色8g小米13plus', '蓝色12g小米10pro', '蓝色12g小米10plus', '蓝色12g小米11pro', '蓝色12g小米11plus', '蓝色12g小米12pro', '蓝色12g小米12plus', '蓝色12g小米13pro', '蓝色12g小米13plus', '蓝色16g小米10pro', '蓝色16g小米10plus', '蓝色16g小米11pro', '蓝色16g小米11plus', '蓝色16g小米12pro', '蓝色16g小米12plus', '蓝色16g小米13pro', '蓝色16g小米13plus', '蓝色24g小米10pro', '蓝色24g小米10plus', '蓝色24g小米11pro', '蓝色24g小米11plus', '蓝色24g小米12pro', '蓝色24g小米12plus', '蓝色24g小米13pro', '蓝色24g小米13plus']
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题