华为OD机试 - 最少数量线段覆盖 - 二叉树(Java 2023 B卷 100分 考试抽中题)

news2024/9/24 7:25:45

在这里插入图片描述

目录

    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 四、Java算法源码
    • 五、效果展示
      • 1、输入
      • 2、输出
      • 3、说明
      • 4、复杂一点
      • 5、理性分析一下

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

一、题目描述

给定坐标轴上的一组线段,线段的起点和终点均为整数并且长度不小于1,请你从中找到最少数量的线段,这些线段可以覆盖住所有线段。

二、输入描述

第一行输入为所有线段的数量,不超过10000,后面每行表示一条线段,格式为"x,y",x和y分别表示起点和终点,取值范围是[-105,105]。

三、输出描述

最少线段数量,为正整数。

四、解题思路

  1. 定义一个节点,有左节点和右节点两个属性;
  2. 在Node类中定义compareTo方法,比较Node左节点;
    • 如果当前node和参数node的左节点相当,返回参数右节点与当前的右节点差;
    • 如果当前node和参数node的左节点不相当,返回当前node和参数node的左节点的差值;
  3. 输入所有线段的数量n;
  4. 输入n个Node节点,有两个值,起点和终点;
  5. 将输入的Node节点进行排序,根据Node左节点进行升序排列;
  6. 定义变量right,记录第一个节点的右节点;
  7. 定义变量maxRight,记录最大右节点,初始化为第一个节点的右节点;
  8. 遍历节点集合arr;
  9. 如果之后的右节点大于第一个右节点;
  10. 比较最大右节点与当前的右节点;
  11. 获取最大右节点;
  12. 循环往复,最后输出最少线段数量。

四、Java算法源码

public static void main(String[] args) {
    Node[] arr = new Node[10000];
    Scanner sc = new Scanner(System.in);
    // 输入所有线段的数量n
    int n = sc.nextInt();
    // 输入n个Node节点,有两个值,起点和终点
    for (int i = 0; i < n; i++) {
        String[] s = sc.next().split(",");
        arr[i] = new Node(Integer.parseInt(s[0]), Integer.parseInt(s[1]));
    }
    
    // 将输入的Node节点进行排序,根据Node左节点进行升序排列
    Arrays.sort(arr, 0, n - 1);

    int ret = 1;
    // 第一个节点的右节点
    int right = arr[0].r;
    // 最大右节点,初始化为第一个节点的右节点
    int maxRight = arr[0].r;
    for (int i = 1; i < n; i++) {
        // 如果之后的右节点大于第一个右节点
        if (arr[i].l > right) {
            // 比较最大右节点与当前的右节点
            if (maxRight > right) {
                ret++;
                right = maxRight;
            }
            if (maxRight < arr[i].l) {
                ret++;
                right = arr[i].r;
            }
        }
        // 获取最大右节点
        maxRight = Math.max(arr[i].r, maxRight);
    }
    if (maxRight > right) {
        ret++;
    }
    System.out.println(ret);
}

/**
 * 定义一个节点,有左节点和右节点两个属性
 */
static class Node implements Comparable<Node> {
    int l, r;

    public Node(int l, int r) {
        this.l = l;
        this.r = r;
    }

    /**
     * 和当前结点进行比较
     * 如果当前node和参数node的左节点相当,返回参数右节点与当前的右节点差
     * 如果当前node和参数node的左节点不相当,返回当前node和参数node的左节点的差值
     * @param o
     * @return
     */
    @Override
    public int compareTo(Node o) {
        if (l == o.l) {
            return o.r - r;
        }
        return l - o.l;
    }
}

五、效果展示

1、输入

3
1,7
3,6
8,9

2、输出

2

3、说明

选取2条线段[1,7]和[8,9]即可,这两条线段可以覆盖[3,6]。

在这里插入图片描述

4、复杂一点

6
15,20
3,6
8,12
1,7
11,15
18,20

5、理性分析一下

先按照节点Node的左节点进行升序排序。

6
1,7
3,6
8,12
11,15
15,20
18,20

  1. 一共6行数据;
  2. 第一行1,7全包含第二行3,6 — 1,7
  3. 第三行8,12,与1,7无覆盖,故输出1,7 + 8,12;
  4. 第四行11,15,不能全覆盖,故输出1,7 + 8,12 + 11,15;
  5. 第五行15,20,不能全覆盖,故输出1,7 + 8,12 + 11,15 + 15,20;
  6. 第六行18,20,被15,20覆盖,故弃用,最后输出1,7 + 8,12 + 11,15 + 15,20,,共最少线段数量 = 4个。

你觉得对吗,自己测试一下吧


🏆下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/935733.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第三讲,三维空间刚体运动

一个刚体在三维空间中的运动是如何描述的。我们当然知道这由一次旋转加一次平移组成。平移确实没有太大问题&#xff0c;但旋转的处理是件麻烦事。我们将介绍旋转矩阵、四 元数、欧拉角的意义&#xff0c;以及它们是如何运算和转换的。 1.向量&#xff0c;坐标系和旋转矩阵 点…

【LeetCode-中等题】19. 删除链表的倒数第 N 个结点

文章目录 题目方法一&#xff1a;节点加入集合找索引方法二&#xff1a;直接计算长度,然后找出要删除的节点的前一个节点方法三&#xff1a;栈方法四&#xff1a;前后双指针 题目 这题的关键在与两个点 一定要设置一个哑结点&#xff0c;防止删除第一个元素时&#xff0c;导致空…

C语言基础之——指针(下)

前言&#xff1a;本篇文章将继续讲解有关指针的剩余基础知识。 学无止境&#xff0c;一起加油叭&#xff01;&#xff01; 目录 一.指针运算 1.指针 - 整数 2.指针的关系运算 3.指针 - 指针 二.指针与数组 三.二级指针 四.指针数组 总结 一.指针运算 指针运算包括以下三…

Tableau可视化入门实践-2

目录 折线图1.导入excel文件数据2.建立折线图并添加标签 双轴折线图 折线图 1.导入excel文件数据 2.建立折线图并添加标签 双轴折线图 行标签拖进两个度量建立上下两个折线图 在第二个折线图纵轴&#xff0c;右键选择“双轴”

DiskCatalogMaker for Mac简单智能快速的磁盘管理工具

DiskCatalogMaker是一款Mac上的磁盘目录管理工具。它可以帮助用户快速创建和管理磁盘目录&#xff0c;方便查找和访问存储在磁盘上的文件和文件夹。它具有快速扫描和索引功能&#xff0c;生成详细的目录列表&#xff0c;支持关键字搜索和自定义标签。 此外&#xff0c;DiskCat…

k8s 查看加入主节点命令 k8s重新查看加入节点命令 k8s输入删除,重新查看加入命令 kuberadm查看加入节点命令

1. 使用kuberadm 安装成功后&#xff0c;clear清除了屏幕数据&#xff0c;加入命令无法查看&#xff0c;使用如下&#xff0c;重新查看node如何加入主节点命令&#xff1a; kubeadm token create --print-join-command --ttl 0 2.画圈的全部是&#xff0c;都复制&#xff0c;在…

反转链表00

题目链接 反转链表 题目描述 注意点 链表中节点的数目范围是 [0, 5000] 解答思路 迭代或递归解决本题 代码 方法一&#xff1a; // 迭代 class Solution {public ListNode reverseList(ListNode head) {if (head null || head.next null) {return head;}ListNode pre…

【原创】jmeter并发测试计划

bankQPS 创建线程组 设置并发参数 HTTP请求GET 添加HTTP请求 GET请求 查看结果树 HTTP请求 POST 添加HTTP请求 参数必须设置头信息格式&#xff1a; 添加HTTP头信息 查看结果树 可以选择&#xff0c;仅查看错误日志 汇总报告

【LLM】解析pdf文档生成摘要

文章目录 一、整体思路二、代码三、小结Reference 一、整体思路 非常简单的一个v1版本 利用langchain和pdfminer切分pdf文档为k块&#xff0c;设置overlap等参数先利用prompt1对每个chunk文本块进行摘要生成&#xff0c;然后利用prompt2对多个摘要进行连贯组合/增删模型可以使…

keras深度学习框架通过简单神经网络实现手写数字识别

背景 keras深度学习框架&#xff0c;并不是一个独立的深度学习框架&#xff0c;它后台依赖tensorflow或者theano。大部分开发者应该使用的是tensorflow。keras可以很方便的像搭积木一样根据模型搭出我们需要的神经网络&#xff0c;然后进行编译&#xff0c;训练&#xff0c;测试…

4.22 TCP 四次挥手,可以变成三次吗?

目录 为什么 TCP 挥手需要四次呢&#xff1f; 粗暴关闭 vs 优雅关闭 close函数 shotdown函数 什么情况会出现三次挥手&#xff1f; 什么是 TCP 延迟确认机制&#xff1f; TCP 序列号和确认号是如何变化的&#xff1f; 在一些情况下&#xff0c; TCP 四次挥手是可以变成 T…

如何识别PCI/PCIE设备需要申请多大的地址空间?

1、PCI/PCIE设备的配置空间 (1)PCI/PCIE设备需要的资源都在配置空间里进行指定&#xff0c;其中需要的地址空间资源在配置空间的基地址寄存器里指定&#xff1b; (2)参考博客&#xff1a;《PCI设备和PCI桥的配置空间(header_type0、header_type1)和配置命令(type0、type1)详解》…

交叉编译 libzdb

参考博客&#xff1a;移植libzdb3.2.2到arm_configure: error: no available database found or s_酣楼驻海的博客-CSDN博客 编译时间 2023-08-23 libzdb 下载&#xff1a; 源码访问如下&#xff1a; https://bitbucket.org/tildeslash/libzdb/src/master/ git 下载链接 …

JavaScript设计模式(一)——构造器模式、原型模式、类模式

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

Lottery抽奖项目学习第二章第一节:环境、配置、规范

Lottery抽奖项目学习第二章第一节&#xff1a;环境、配置、规范 环境、配置、规范 下面以DDD架构和设计模式落地实战的方式&#xff0c;进行讲解和实现分布式抽奖系统的代码开发&#xff0c;那么这里会涉及到很多DDD的设计思路和设计模式应用&#xff0c;以及互联网大厂开发中…

【GoLang】go入门:go语言执行过程分析 常见数据类型(基本数据类型)

1、go语言执行过程分析 【1】执行流程分析 通过 go build 进行编译 运行上一步生成的可执行文件 通过 go run 命令直接运行 【2】上述两种执行流程的区别 在编译时&#xff0c;编译器会将程序运行时依赖的库文件包含在可执行文件中&#xff0c;所以可执行文件会变大很多通过g…

c++中的基本类型

专栏简介&#xff1a;为什么我要重新介绍c的相关知识&#xff0c;在此之前&#xff0c;我对于c的了解也仅仅是在表面。而在后来与c慢慢的接触中&#xff0c;c编程语言越来越让我觉得深奥&#xff0c;所以还是想要重新开创一个专栏来介绍c。对于c的介绍&#xff0c;本专栏会先介…

学会shell 基本语法,玩转linux

01、获取当前时间&#xff0c;年月日时分秒 now$(date %Y%m%d%H%M%S) echo "$now" 输出为&#xff1a;20181202222727 02、date 在脚本中的几种用法 date %Y 以 4 位数字格式打印年份 date %y 以 2 位数字格式打印年份 date %m 月份 date %d 日期 date %H 小时 d…

IO模型和NGINX安装升级

IO模型和NGINX安装升级 IO模型 IO概念 I/O在计算机中指Input/Output&#xff0c; IOPS (Input/Output Per Second)即每秒的输入输出量(或读写次数)&#xff0c;是衡量磁盘性能的主要指标之一。 Linux的IO类型 磁盘I/O 磁盘I/O是进程向内核发起系统调用&#xff0c;请求磁…

抖店出单后怎么操作?谈厂家话术与发货注意事项,抖店最新教程

我是王路飞。 当你的抖店出单后&#xff0c;你是怎么操作的? 还是像之前那样去拼多多代拍发货&#xff1f;这样做的商家&#xff0c;不知道你的店铺被封了几个了&#xff1f; 记住&#xff0c;现在抖店出单后&#xff0c;一定不要再去多多拍单发货了&#xff01; 关于抖店…