JavaScript数组分组 - 查找根据定义的边可以到达的数字集合


考虑以下输入和输出数组:

const input = ["0:3", "1:3", "4:5", "5:6", "6:8"]; const output = [
   [0, 1, 3],
   [4, 5, 6, 8]
];

将每个数字视为图中的一个节点,并将每对x:y视为节点x和y之间的边,我们需要找到可以使用定义的边到达的数字集合。

也就是说,用图论术语来说,就是在这样的图中找到不同的连通分量。例如,在上图中,无法从4到达0,因此它们属于不同的组,但可以从1到达0(通过3),因此它们属于同一组。“重申一下,所需的输出是基于潜在的随机输入集的可遍历节点分组。

我们需要编写一个JavaScript函数,根据给定的输入构建所需的输出。

示例

const input = ["0:3", "1:3", "4:5", "5:6", "6:8"];
const groupRange = (arr = []) => {
   const res = [[]];
   let count = 0;
   const a = [0];
   let array = arr.map(el => el.split(':').sort((a, b) => a - b)). sort((a, b) => a[0] - b[0]); array.forEach(el => {
      if (el[0] > a[a.length - 1]) {
         res.push(el);
          a.push(el[1]);
         count++;
      } else {
         res[count] = res[count].concat(el);
         a[a.length - 1] = el[1];
      };
   });
   return res.map(el => [...new Set(el)].sort((a, b) => a - b));
}
console.log(groupRange(input));

输出

控制台中的输出将是:

[ [ '0', '1', '3' ], [ '4', '5', '6', '8' ] ]

更新于:2020年11月21日

71 次浏览

开启你的职业生涯

完成课程后获得认证

开始学习
广告