华为OD机试真题—— 最少数量线段覆盖/多线段数据压缩(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

article/2025/6/9 3:49:13

在这里插入图片描述

2025 A卷 100分 题型

本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析;
并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式!

2025华为OD真题目录+全流程解析/备考攻略/经验分享

华为OD机试真题《最少数量线段覆盖/多线段数据压缩》:


目录

    • 题目名称:最少数量线段覆盖/多线段数据压缩
      • 题目描述
    • Java
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 测试示例
      • 综合分析
    • python
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 测试示例
      • 综合分析
    • JavaScript
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 测试示例
      • 综合分析
    • C++
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 测试示例
      • 综合分析
    • C语言
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 测试示例
      • 综合分析
    • GO
      • 问题分析
      • 解题思路
      • 代码实现
      • 代码详细解析
      • 测试示例
      • 综合分析


题目名称:最少数量线段覆盖/多线段数据压缩


知识点:排序、贪心算法
时间限制:1秒
空间限制:256MB
限定语言:不限


题目描述

给定坐标轴上的一组线段(起点和终点为整数且长度≥1),从中选出最少数量的线段,使其能覆盖所有线段。

输入描述:

  • 第一行为线段数量N(≤10000)
  • 后续N行每行为线段起点和终点,格式为"x,y"(取值范围[-10⁵, 10⁵])

输出描述:

  • 最少线段数量(正整数)

示例:
输入:

3  
1,4  
2,5  
3,6  

输出:

2  

说明:选取线段[1,4]和[3,6],可覆盖所有线段。


Java

问题分析

我们需要从一组线段中选出最少数量的线段,使得它们的并集覆盖所有原始线段的并集。例如,输入三个线段 [1,4][2,5][3,6],它们的并集是 [1,6],选择 [1,4][3,6] 即可覆盖整个区间。


解题思路

  1. 排序线段:将所有线段按起点从小到大排序,若起点相同则按终点从大到小排序。
  2. 贪心算法:每次选择能覆盖当前最左端点且右端点最远的线段,逐步扩展覆盖范围。
  3. 终止条件:当覆盖范围达到所有线段的最大右端点时结束。

代码实现

import java.util.*;class Segment {int start;int end;public Segment(int start, int end) {this.start = start;this.end = end;}
}public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();scanner.nextLine(); // 读取换行符List<Segment> segments = new ArrayList<>();// 1. 读取所有线段for (int i = 0; i < n; i++) {String[] parts = scanner.nextLine().split(",");int start = Integer.parseInt(parts[0]);int end = Integer.parseInt(parts[1]);segments.add(new Segment(start, end));}// 2. 排序线段:按起点升序,若起点相同按终点降序segments.sort((a, b) -> {if (a.start != b.start) {return Integer.compare(a.start, b.start);} else {return Integer.compare(b.end, a.end);}});// 3. 找到所有线段的合并区间的总范围int L = Integer.MAX_VALUE;int R = Integer.MIN_VALUE;for (Segment seg : segments) {if (seg.start < L) L = seg.start;if (seg.end > R) R = seg.end;}int count = 0; // 记录选择的线段数量int currentEnd = L; // 当前覆盖的最右端点int i = 0; // 遍历线段的指针// 4. 贪心算法:每次选择能覆盖当前最左端点且最远的线段while (currentEnd < R) {int maxEnd = currentEnd; // 当前能覆盖的最远右端点boolean found = false; // 是否找到可扩展的线段// 遍历所有起点小于等于 currentEnd 的线段while (i < segments.size() && segments.get(i).start <= currentEnd) {if (segments.get(i).end > maxEnd) {maxEnd = segments.get(i).end;found = true; // 找到可扩展的线段}i++; // 移动指针}if (!found) { // 无解,无法覆盖整个区间System.out.println(-1);return;}count++; // 选中线段currentEnd = maxEnd; // 更新当前覆盖的最右端点}System.out.println(count);}
}

代码详细解析

  1. 读取输入

    • 读取线段数量 n,然后逐行读取每个线段的起点和终点,存入 List<Segment>
  2. 排序线段

    • 按起点从小到大排序,若起点相同则按终点从大到小排序。这确保在相同起点的线段中优先选择更长的线段。
  3. 确定总区间范围

    • 遍历所有线段,找到最小的起点 L 和最大的终点 R,即所有线段合并后的总区间。
  4. 贪心算法核心

    • currentEnd 表示当前覆盖的最右端点,初始化为 L
    • 在每次循环中,找到所有起点小于等于 currentEnd 的线段中右端点最大的线段。
    • 若找不到能扩展覆盖范围的线段,则输出 -1
    • 每选择一个线段,更新 currentEnd 并增加计数器 count

测试示例

示例1:

输入:
3
1,4
2,5
3,6输出:
2

解析:排序后线段顺序为 [1,4], [2,5], [3,6]。第一次选择 [1,4],覆盖到4;第二次选择 [3,6],覆盖到6,总数量为2。

示例2:

输入:
2
1,3
4,6输出:
-1

解析:线段 [1,3][4,6] 无法覆盖中间区间 [3,4],返回 -1


综合分析

  1. 时间复杂度

    • 排序时间复杂度为 O(n log n)
    • 贪心算法遍历线段时间复杂度为 O(n)
    • 总体时间复杂度为 O(n log n),适用于 n ≤ 10000
  2. 空间复杂度

    • 存储线段需要 O(n) 空间。
  3. 优势

    • 贪心算法保证每次选择最优线段,确保全局最优。
    • 排序策略简化了后续选择过程。
  4. 适用性

    • 适用于需要覆盖连续区间且线段可能重叠的场景。

python

问题分析

我们需要从一组线段中选出最少数量的线段,使得它们的并集覆盖所有原始线段的并集。例如,输入三个线段 [1,4][2,5][3,6],它们的并集是 [1,6],选择 [1,4][3,6] 即可覆盖整个区间。


解题思路

  1. 排序线段:将线段按起点升序排序,若起点相同则按终点降序排序。
  2. 贪心算法:每次选择能覆盖当前最左端点且右端点最远的线段,逐步扩展覆盖范围。
  3. 终止条件:当覆盖范围达到所有线段的最大右端点时结束。

代码实现

class Segment:def __init__(self, start, end):self.start = startself.end = endn = int(input())
segments = []
for _ in range(n):x, y = map(int, input().split(','))segments.append(Segment(x, y))# 1. 按起点升序排序,起点相同则按终点降序排序
segments.sort(key=lambda s: (s.start, -s.end))# 2. 计算总区间的起点L和终点R
if not segments:print(0)exit()
L = min(s.start for s in segments)
R = max(s.end for s in segments)count = 0
current_end = L  # 当前覆盖的最右端点
i = 0  # 遍历线段的指针# 3. 贪心算法:每次选择能覆盖当前最左端点且最远的线段
while current_end < R:max_end = -float('inf')# 遍历所有起点 <= current_end 的线段,找到最大终点while i < len(segments) and segments[i].start <= current_end:if segments[i].end > max_end:max_end = segments[i].endi += 1if max_end == -float('inf'):  # 无法覆盖整个区间print(-1)exit

http://www.hkcw.cn/article/whJBuVxDJi.shtml

相关文章

古代小孩哥怎么过六一 绿意中撒欢踢毽子

今天是六一儿童节,让我们一起看看古代的孩子们在这一天会玩些什么。古代的童趣VCR展示了高能量小孩哥的日常。他们在绿意盎然的环境中尽情撒欢,青翠的柳荫、碧绿的草地,还有亲密的玩伴。孩子们选择组团踢毽子,只见小孩哥眼神专注,动作轻快,毽子跃起时衣角也随之飘动。旁边…

有捏捏玩具甲醛超标40多倍 安全问题引热议

近日,拥有百万粉丝的捏捏玩具博主“有只猫叫小朋友”在社交平台上发布癌症诊断书,并表示暂停更新。这一举动引发了关于捏捏玩具安全性的讨论。有网友留言称,自己和孩子玩过捏捏玩具后出现了头疼、嗓子疼的情况。捏捏玩具是一种流行的硅胶材质慢回弹类解压玩具,外形多为软萌…

宇树机器狗go2添加3d雷达(下)添加velodyne系列雷达

0.前言 上一篇文章教大家如何在宇树机器狗go2的仿真环境中添加3d雷达livox mid360&#xff08;宇树机器狗go2 添加3d雷达&#xff08;上&#xff09;添加livox系列雷达&#xff09;&#xff0c;本期文章会教大家添加lvelodyne的系列雷达&#xff0c;是添加3d雷达的下期。宇树机…

美国终止艾滋病疫苗研发项目 转向现有方法消除艾滋病

特朗普政府终止了一项2.58亿美元的项目,对艾滋病疫苗研发工作造成了沉重打击。一位不愿透露姓名且未经授权发言的高级官员表示,美国国立卫生研究院计划将关注点转向利用现有方法消除艾滋病,并暂停了莫德纳公司研发的一项艾滋病疫苗临床试验。公共卫生专家指出,这些削减措施…

需求分析文档(PRD)编写指南——结构化定义与标准化写作方法

序言 在产品研发过程中&#xff0c;需求分析文档&#xff08;PRD&#xff09;是连接业务目标与技术实现的核心纽带。一份清晰的PRD能够&#xff1a; 统一团队认知&#xff1a;让产品、开发、测试等角色对需求的理解保持一致&#xff1b; 减少沟通成本&#xff1a;通过结构化描…

使用Shell脚本实现多GPU上的Ollama模型自动部署

使用Shell脚本实现多GPU上的Ollama模型自动部署 在大规模AI应用场景中&#xff0c;我们经常需要在多个GPU上同时部署不同的语言模型。本文将介绍一个自动化部署脚本&#xff0c;用于在多个GPU上高效部署和管理Ollama模型。 功能特点 自动停止已运行的Ollama服务支持多GPU并行…

Apdex评分从3级到5级标准划分思路详解

什么是 Apdex APdex &#xff08;Application Performance Index&#xff09;‌是一个用于评估应用性能的工业标准&#xff0c;也被称为 满意度&#xff0c;广泛应用于性能监控和优化。由 Apdex联盟开发,它从用户的角度出发&#xff0c;将应用响应时间的表现&#xff0c;转化为…

MATLAB 绘制带误差棒的拟合图:从入门到精通

在科学研究和工程实践中&#xff0c;数据可视化是理解数据特性、验证模型假设的重要手段。今天&#xff0c;我们来深入探讨一种极具价值的数据可视化形式——带误差棒的拟合图&#xff0c;并手把手教你如何用 MATLAB 实现它。 一、什么是带误差棒的拟合图 带误差棒的拟合图是…

[面试精选] 0206. 反转链表

文章目录 1. 题目链接2. 题目描述3. 题目示例4. 解题思路5. 题解代码6. 复杂度分析 1. 题目链接 206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 2. 题目描述 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 3. 题目示例 示例 1 :…

“香会”现场,中方代表发声!

第22届香格里拉对话会正在新加坡举行中国人民解放军国防大学代表团成员张弛在现场回应一系列焦点问题解放军打“独”促统不停步!在今年的香格里拉对话会上,台湾问题多次被提及。对此,张弛表示,“台独”分裂与台海和平是水火不容的,赖清德当局一年多来大肆挑动两岸的对立对…

乌总统顾问:备忘录未来实施恐困难重重

俄罗斯方面5月30日称,俄代表团已经准备好在6月2日与乌克兰开启第二轮谈判,希望双方能就和平协议备忘录内容进行讨论。乌克兰官员5月31日表示,由于俄罗斯未公开备忘录内容,乌方猜测大概率与俄方官员此前声明并无差异,未来实施备忘录内容可能困难重重。乌克兰总统办公室主任…

夺冠、庆祝、然后被捕……昨夜巴黎街头如“战场”

5月31日,法甲球队巴黎圣日耳曼5比0大胜意甲球队国际米兰,捧起本赛季欧冠联赛冠军奖杯。彻夜狂欢的法国球迷聚集在巴黎香榭丽舍大街及“大巴黎”主场王子公园一带。据巴黎警方消息,至午夜已有至少81人因滋事被捕。户外烟花声、鸣笛声、欢呼声不绝于耳,间或传来警笛声。据法媒…

基于联咏平台NT985XX 编码配置及常见问题解析

一、概述 hd_videoenc 的主要目的是从上层单元获取图像原始数据&#xff0c;并控制视频编码器对该图像进行编码&#xff0c;输出码流后可用于保存档案或进行在线串流。 二、HDAL interface介绍 这部分可以直接参考 video_record.c 这支 sample code&#xff0c; 开启与关闭…

【PCI】PCI入门介绍(包含部分PCIe讲解)

先解释一下寻址空间&#xff1a; 机器是32bit的话&#xff0c;意味着4G&#xff08;2的32次方&#xff09;寻址空间&#xff0c;内存条作为它的实际物理存储设备。大部分在跑内存程序运行&#xff0c;少部分用来存放其他东西。这是一个常见的4G寻址空间分布&#xff08;不一定是…

中方批美印太战略:除了挑事端搞乱亚太毫无建树

中方批美“印太战略”:除了挑事端 搞乱亚太 毫无建树5月31日,在新加坡出席香格里拉对话会的中国国防大学教授孟祥青在接受总台记者采访时表示,美国在对话会中制造地区分裂,但是东盟国家更关注合作和发展,这才是地区国家的共同心声。var chan_v_w = 960,chan_v_h = 540,cha…

【NLP 78、手搓Transformer模型结构】

你以为走不出的淤泥&#xff0c;也迟早会云淡风轻 —— 25.5.31 引言 ——《Attention is all you need》 《Attention is all you need》这篇论文可以说是自然语言处理领域的一座里程碑&#xff0c;它提出的 Transformer 结构带来了一场技术革命。 研究背景与目标 在 Transfo…

Attention GhostUNet++ 混合的U-Net

最近看到一个全新的分割网络&#xff0c;虽然这个网络并没有发在什么顶级期刊&#xff0c;但是思路还是有点意思的。它是一个混合结合。他将所有的基本都组合在一起了。大家看名字就可以看出来。

C++23 已移除特性解析

文章目录 引言C23 已移除特性介绍1. 垃圾收集的支持和基于可达性的泄漏检测&#xff08;P2186R2&#xff09;背景与原理存在的问题移除的影响 2. 混合宽字符串字面量拼接非良构&#xff08;P2201R1&#xff09;宽字符串编码概述混合拼接的问题示例分析移除的意义 3. 不可编码宽…

CTFHub-RCE 命令注入-过滤cat

观察源代码 代码里面可以发现过滤了cat 判断是Windows还是Linux 源代码中有 ping -c 4 说明是Linux 查看有哪些文件 127.0.0.1|ls 打开flag文件 我们尝试将cat转义打开这个文件 127.0.0.1|c\a\t flag_6562854712907.php 可是发现 文本内容显示不出来&#xff0c;所以怀…

Dota2参议院与递增的三元子序列:算法揭示策略与模式的双重世界

博客引言&#xff1a; 在我们的生活中&#xff0c;策略与模式无处不在&#xff0c;它们既是解决问题的关键&#xff0c;也是揭示隐藏规律的钥匙。今天&#xff0c;我们将通过两个有趣的问题&#xff0c;探索算法如何在策略博弈与模式识别中发挥作用。 首先&#xff0c;我们将…