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

news/2024/7/20 16:19:20 标签: 华为od, java, 算法, 二叉树

在这里插入图片描述

目录

    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 四、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算法源码

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.niftyadmin.cn/n/4977278.html

相关文章

Mysql--技术文档--MVCC(Multi-Version Concurrency Control | 多版本并发控制)

MVCC到底是什么 MVCC&#xff08;Multi-Version Concurrency Control&#xff09;是一种并发控制机制&#xff0c;用于解决并发访问数据库时的数据一致性和隔离性问题。MVCC允许多个事务同时读取数据库的同一数据&#xff0c;而不会相互干扰或导致冲突。 在传统的并发控制机制中…

c语言六子棋(Alpha-Beta剪枝算法)

c语言Alpha-Beta剪枝算法六子棋介绍 Alpha-Beta剪枝算法是一种用于优化博弈树搜索的算法&#xff0c;可以在搜索过程中减少不必要的计算&#xff0c;从而提高搜索效率。该算法常用于博弈游戏&#xff0c;如六子棋。 六子棋是一种类似于五子棋的棋类游戏&#xff0c;在一个六边形…

【排序】快排的优化(三数取中)

三数取中 就是将整个数组分为两半&#xff0c;三个数&#xff08;头、尾、中间&#xff09;的第二大的数字和 left 位置的数字相交换&#xff0c;可以避免排一个有序的数组从而出现单分支树的情况。 如果每次都找了一个最小的值作为基准值&#xff0c;那就会导致这个结点没有左…

Spring中@Value注解取值为null问题排查

文章目录 一、背景二、Value 取值为 null 原因分析2.1. Value 取值为 null 常见原因分析常见现象一&#xff1a;类没有交给 Spring 管理&#xff0c;比如类没有加上 Component 等注解常见现象二&#xff1a;手动 new 对象实例&#xff0c;没有从 Spring 容器中获取常见现象三&a…

跨境出海:如何轻松应对多账号管理

在如今的跨境电商时代&#xff0c;成功经营一个线上店铺不再仅仅需要商品和服务&#xff0c;还需要精通广告投放、营销策略等多个领域。 然而&#xff0c;老练的电商从业者知道&#xff0c;如果不重视平台账号的管理方法&#xff0c;可能会导致店铺或营销账号被关联&#xff0…

在云原生时代,构建高效的大数据存储与分析平台

文章目录 1. **选择适当的数据存储技术&#xff1a;**2. **采用分布式架构&#xff1a;**3. **数据分区和索引&#xff1a;**4. **采用列式存储&#xff1a;**5. **数据压缩和编码&#xff1a;**6. **使用缓存技术&#xff1a;**7. **数据分片和复制&#xff1a;**8. **自动化运…

大数据学习:Hive安装部署

Hive的安装部署 注意hive就是一个构建数据仓库的工具&#xff0c;只需要在一台服务器上安装就可以了&#xff0c;不需要在多台服务器上安装。 此处以安装到node03为例&#xff1b;请大家保持统一 使用hadoop普通用户操作 1.1 先决条件 搭建好三节点Hadoop集群&#xff1b;node…

爬虫逆向实战(二十三)--某准网数据

一、数据接口分析 主页地址&#xff1a;某准网 1、抓包 通过抓包可以发现数据接口是api_to/search/company_v2.json 2、判断是否有加密参数 请求参数是否加密&#xff1f; 通过查看“载荷”模块可以发现b参数和kiv参数是加密参数 请求头是否加密&#xff1f; 无响应是否加…