请教一道算法题?

作者站长头像
站长
· 阅读数 9

有以下数据:

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个回答
avatar
test
2024-07-04

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

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);
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容