华为OD机试真题区间连接器(连接器问题)(java&python)
Posted 笑着的程序员
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为OD机试真题区间连接器(连接器问题)(java&python)相关的知识,希望对你有一定的参考价值。
区间连接器
知识点数组排序Q滑窗时间限制:1s空间限制:256MB限定语言:不限
题目描述:
有一组区间[a0,b0],[a1,b1],…(a,b表示起点,终点),区间有可能重叠、相邻, 重叠或相邻则可以合并为更大的区间;给定一组连接器[x1,x2,x3,…](x表示连接 器的最大可连接长度,即x>=gap),可用于将分离的区间连接起来,但两个分离区 间之间只能使用1个连接器;请编程实现使用连接器后,最少的区间数结果。区间数量<10000;a,b均<=10000连接器梳理<10000;×<=10000
输入描述:
区间组:[1,10],[15,20],[18,30],[33,40]
连接器组:[5,4,3,2]
输出描述:
1
说明:
合井后:[1,10],[15,30],[33,40],使用5,3两个连接器连接后只剩下[1,40]
示例1
输入:
[1,10],[</
华为OD机试真题 JavaScript 实现区间交叠问题2023 Q1 | 100分
所有题目均有四种语言实现。C++ 实现目录、Python实现目录、Java实现目录、JavaScript实现目录
题目
给定坐标轴上的一组线段,线段的起点和终点均为整数并且长度不小于1,请你从中找到最少数量的线段,这些线段可以覆盖住所有线段。
输入描述
第一行输入为所有线段的数量,不超过10000,后面每行表示一条线段,格式为”x,y”,
x和y 分别表示起点和终点,取值范围是[-10^5,10^5]。
输出描述
最少线段数量,为正整数。
示例1 输入输出示例仅供调试,后台判题数据一般不包含示例
输入
3
1,4
2,5
3,6输出
2
思路
1:又是一个典型的区间问题,先将所有线段按起点从小到大排序。
2:逐个选取每一个线段,将其作为开始的线段,再找出剩余的线段中左端点小于等于开始线段的右端点中(若没有则无解),找出右端点最大的一个线段,起始就是贪心算法。其右端点越大,其右端覆盖到的地方也就最优。反复重复上一步,直到覆盖完整个长度为m的区间,就能得到最少的线段数。
JS输入输出
JavaScript 本身有两种模式:V8 和 Node,两种模式在输入上略有不同。
Node:
let readline = require("readline"); const rl = readline.createInterface( input: process.stdin, output: process.stdout, ); rl.on('line', function(line) // line表示的就是输入的一行 let lines = line.split(' ').map(Number); );
V8:
//假设输入为: 4 5 1 2 // readline() 就表示输入的一行,和python中的 input()函数用法基本一致 let n = readline().split('').map(item=>parseInt(item)); // 4 let k = readline().split(' ').map(item=>parseInt(item)); // 5 let [nums] = readline().split(' ').map(item=>parseInt(item)); // 1 2
具体我也是参考了网上的博主的文章:ACM模式下JavaScript(js)的输入输出 V8 Node_我先润了的博客-CSDN博客
ACM格式javascript 输入输出 - 衣囧~ - 博客园 (cnblogs.com)
不熟悉的可以自行查阅。
这里给出这位博主的总结:
node.js=V8+内置基本模块,相当于java中的JRE=JVM+java标准库
node就是带有能操作IO和网络库的V8引擎,提供了很多可调用的API使得JavaScript能够读写文件,网络请求,系统信息等操作。对V8引擎进行了封装,执行JavaScript的速度更快,性能更好。
Code
//JSRUN引擎2.0,支持多达30种语言在线运行,全仿真在线交互输入输出。
function main(ranges)
ranges.sort((a, b) => a[0] - b[0]);
var stack = [ranges[0]];
for (let i = 1; i < ranges.length; i++)
var range = ranges[i];
while (true)
if (stack.length == 0)
stack.push(range);
break;
var [start_1, end_1] = stack[stack.length-1];
var [start_2, end_2] = range;
if (start_2 <= start_1)
if (end_2 <= start_1)
break;
else if (end_2 < end_1)
break;
else
stack.pop();
else if (start_2 < end_1)
if (end_2 <= end_1)
break;
else
stack.push([end_1, end_2]);
break;
else
stack.push(range);
break;
console.log(stack.length);
main([[1,4],[2,5],[3,6]])
要求
时间限制:C/C++ 1秒,其他语言 2秒
空间限制:C/C++262144K,其他语言524288K
64bit IO Format:%lld
语言限定:
C(clang11), C++(clang++11), Pascal(fpc 3.0.2), Java(javac 1.8), Python2(2.7.3),
PHP(7.4.7), C#(mcs5.4), ObjC(gcc 5.4), Pythen3(3.9), JavaScript Node(12.18.2), JavaScript V8(6.0.0),
Sqlite(3.7.9), R(4.0.3), Go(1.14.4), Ruby(2.7.1), Swift(5.3), matlab(Octave 5.2), Pypy2(pypy2.7.13),
Pypy3(pypy3.6.1), Rust(1.44), Scala(2.11.12), Kotlin(1.4.10), Groovy(3.0.6), TypeScript(4.1.2), Mysql(8.0)
以上是关于华为OD机试真题区间连接器(连接器问题)(java&python)的主要内容,如果未能解决你的问题,请参考以下文章
华为OD机试真题 Java 实现快递投放问题2023 Q1 | 100分
华为OD机试真题 JavaScript 实现区间交叠问题2023 Q1 | 100分
华为OD机试真题 C++ 实现快递投放问题2023 Q1 | 100分