华为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分

华为OD机试真题 Python 实现快递投放问题2023 Q1 | 100分

新2023Q2模拟题JAVA华为OD机试 - 拼接 URL

华为机试真题 C++ 实现连接器问题2022.11 Q4新题