华为OD机试 2023B卷题库疯狂收录中,刷题点这里
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
有一组区间 [a0, b0], [a1, b1], … (a, b 表示起点, 终点),区间有可能重叠、相邻,重叠或相邻则可以合并为更大的区间;
给定一组连接器[x1, x2, x3, …](x 表示连接器的最大可连接长度,即 x>=gap),可用于将分离的区间连接起来,但两个分离区间之间只能使用1个连接器;
请编程实现使用连接器后,最少的区间数结果。
区间数量 <10000;a,b 均 <=10000;
连接器梳理 <10000; x <=10000;
区间组:[1,10],[15,20],[18,30],[33,40]
连接器组:[5,4,3,2]
1
说明:合并后:[1,10], [15,30], [33,40],使用 5, 3 两个连接器连接后只剩下 [1,40]
function calculateMinIntervals(rangeArr, connectList) {
rangeArr.sort((a, b) => a[0] - b[0]);
const mergeRanges = [rangeArr[0]];
const linked = [];
for (let i = 1; i < rangeArr.length; i++) {
const last = mergeRanges[mergeRanges.length - 1];
const [a, b] = last;
const [r1, r2] = rangeArr[i];
if (r1 <= b) {
mergeRanges.pop();
mergeRanges.push([a, Math.max(b, r2)]);
} else {
linked.push(r1 - b);
mergeRanges.push(rangeArr[i]);
}
}
linked.sort((a, b) => b - a);
connectList.sort((a, b) => b - a);
while (connectList.length > 0 && linked.length > 0) {
if (connectList.pop() >= linked[linked.length - 1]) {
linked.pop();
}
}
return linked.length + 1;
}
[1,10],[15,20],[18,30],[33,40]
[5,4,3,2]
1
下一篇:华为OD机试真题 JavaScript 实现【贪心的商人】【2023Q1 100分】
本文收录于,华为OD机试(JavaScript)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。