题目描述:
给定M个端口组,其中1 <= M <= 10。每个端口组是一个包含N个整数的数组,其中1 <= N <= 100。如果两个端口组中有至少2个相同的端口,则可以将它们合并。请实现合并逻辑,并返回合并后的端口组。
输入:
第一行:端口组的数量M。
接下来的M行:每行表示一个端口组,由逗号分隔的整数构成。
输出:
合并后的端口组列表,以二维数组形式表示。
注意:
在合并的端口组中,相同的端口只保留一个,并且按升序排序。
合并的端口组之间的顺序应与输入中的原始顺序相同。
示例:
输入:
4
4
2,3,2
1,2
5
输出:
[[4],[2,3],[1,2],[5]]
代码
function mergePorts(m, groups) {
merge(groups);
// 去重并排序每个组
for (let i = 0; i < groups.length; i++) {
groups[i] = [...new Set(groups[i])].sort((a, b) => a - b);
}
console.log(groups);
// 尝试合并端口组
function merge(groups) {
for (let i = groups.length - 1; i >= 0; i--) {
// 从当前元素的前一个元素开始到数组头部
for (let j = i - 1; j >= 0; j--) {
let set1 = new Set(groups[i]);
let set2 = new Set(groups[j]);
// 检查两个端口组是否有共同的端口
if (check(set1, set2)) {
// 如果可以合并,则合并两个组
groups[j] = groups[j].concat(groups[i]);
// 移除已经合并的组
groups.splice(i, 1);
// 递归调用自身,继续检查是否还有可以合并的组
merge(groups);
return;
}
}
}
}
// 检查两个端口组是否有至少2个共同的端口
function check(set1, set2) {
let count = 0;
for (let num of set1) {
if (set2.has(num)) {
count++;
}
if (count >= 2) {
return true;
}
}
return false;
}
}
mergePorts(4, [
[4],
[2, 3, 2],
[1, 2],
[5]
]);