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

在这里插入图片描述

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.pswp.cn/bicheng/83186.shtml

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

相关文章

EasyRTC嵌入式音视频实时通话SDK助力AI与IoT智能硬件打造音视频交互多场景应用

一、引言​ 在数字化浪潮下&#xff0c;AI与IoT深度融合重塑智能硬件产业。实时音视频通信是智能硬件交互的核心&#xff0c;其性能关乎用户体验与场景拓展。EasyRTC嵌入式音视频实时通话SDK基于WebRTC技术&#xff0c;以轻量、易扩展的特性&#xff0c;为AI与IoT智能硬件融合…

第十四章 MQTT订阅

系列文章目录 系列文章目录 第一章 总体概述 第二章 在实体机上安装ubuntu 第三章 Windows远程连接ubuntu 第四章 使用Docker安装和运行EMQX 第五章 Docker卸载EMQX 第六章 EMQX客户端MQTTX Desktop的安装与使用 第七章 EMQX客户端MQTTX CLI的安装与使用 第八章 Wireshark工具…

【第4章 图像与视频】4.4 离屏 canvas

文章目录 前言为什么要使用 offscreenCanvas为什么要使用 OffscreenCanvas如何使用 OffscreenCanvas第一种使用方式第二种使用方式 计算时长超过多长时间适合用Web Worker 前言 在 Canvas 开发中&#xff0c;我们经常需要处理复杂的图形和动画&#xff0c;这些操作可能会影响页…

Go语言事件总线EventBus本地事件总线系统的完整实现框架

在Go语言中&#xff0c;EventBus是一种非常有用的工具&#xff0c;它通过事件驱动的编程方式&#xff0c;帮助开发者实现组件之间的解耦&#xff0c;提高代码的可维护性和扩展性。 背景 软件架构的发展需求&#xff1a;随着软件系统的规模和复杂度不断增大&#xff0c;传统的紧…

Go语言接口:灵活多态的核心机制

引言 Go语言的接口系统是其​​面向对象编程​​的核心&#xff0c;它摒弃了传统语言的类继承体系&#xff0c;采用独特的​​隐式实现​​和​​鸭子类型​​设计。这种设计使得Go接口既灵活又强大&#xff0c;成为构建松耦合系统的关键工具。本文将深入剖析Go接口的实现机制…

DeviceNET转EtherCAT网关:医院药房自动化的智能升级神经中枢

在现代医院药房自动化系统中&#xff0c;高效、精准、可靠的设备通信是保障患者用药安全与效率的核心。当面临既有支持DeviceNET协议的传感器、执行器&#xff08;如药盒状态传感器、机械臂限位开关&#xff09;需接入先进EtherCAT高速实时网络时&#xff0c;JH-DVN-ECT疆鸿智能…

android实现使用RecyclerView详细

显示页面代码&#xff1a;activity_category_inventory.xml代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android" xmlns:app"http://schemas.and…

【SpringBoot实战】优雅关闭服务

文章目录 一、什么是优雅关闭&#xff1f;二、优雅关闭的核心步骤三、SpringBoot优雅关闭实现四、关键注意事项1. 超时时间必须配置2. 信号支持局限性3. 特殊请求处理 五、底层实现原理六、总结 一、什么是优雅关闭&#xff1f; 优雅关闭&#xff08;Graceful Shutdown&#x…

C++哈希表:unordered系列容器详解

本节目标 1.unordered系列关联式容器 2.底层结构 3.模拟实现 4.哈希的应用 5.海量数据处理面试题 unordered系列关联式容器 在c98中&#xff0c;STL提供了底层为红黑树结构的一系列关联式容器&#xff0c;在查询时效率可以达到logN&#xff0c;即最差的情况下需要比较红…

java操作服务器文件(把解析过的文件迁移到历史文件夹地下)

第一步导出依赖 <dependency><groupId>org.apache.sshd</groupId><artifactId>sshd-core</artifactId><version>2.13.0</version></dependency> 第二步写代码 public void moveFile( List<HmAnalysisFiles> hmAnalys…

Oracle OCP认证的技术定位怎么样?

一、引言&#xff1a;Oracle OCP认证的技术定位​ Oracle Certified Professional&#xff08;OCP&#xff09;认证是数据库领域含金量最高的国际认证之一&#xff0c;其核心价值在于培养具备企业级数据库全生命周期管理能力的专业人才。随着数字化转型加速&#xff0c;OCP认证…

TK海外抢单源码/指定卡单

​ 抢单源码&#xff0c;有指定派单&#xff0c;打针&#xff0c;这套二改过充值跳转客服 前端vue 后端php 两端分离 可二开 可以指定卡第几单&#xff0c;金额多少&#xff0c; 前后端开源 PHP7.2 MySQL5.6 前端要www.域名&#xff0c;后端要admin.域名 前端直接静态 伪静…

远程线程注入

注入简单来说就是让别人的程序执行 你想要让他执行的dll #include<iostream> #include<Windows.h> using namespace std;char szBuffer[] "C:\\Users\\20622\\source\\repos\\Dll1\\Debug\\test.dll"; //dll路径void RemoteThreadInject(DWORD Pid,PCH…

【Java实战】集合排序方法与长度获取方法辨析(易懂版)

一、排序方法 1. 对List排序的两种方式 方式一Collections.sort() List<Integer> numbers Arrays.asList(3,1,4,2); Collections.sort(numbers); // 直接修改原list → [1,2,3,4]方式二&#xff1a;list.sort()&#xff08;Java8推荐&#xff09; List<String>…

企业级安全实践:SSL/TLS 加密与权限管理(一)

引言 ** 在数字化转型的浪潮中&#xff0c;企业对网络的依赖程度与日俱增&#xff0c;从日常办公到核心业务的开展&#xff0c;都离不开网络的支持。与此同时&#xff0c;网络安全问题也日益严峻&#xff0c;成为企业发展过程中不可忽视的重要挑战。 一旦企业遭遇网络安全事…

Java 大视界 -- Java 大数据在智能医疗影像数据压缩与传输优化中的技术应用(227)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

Python编程基础(一) | 变量和简单数据类型

引言&#xff1a;很久没有写 Python 了&#xff0c;有一点生疏。这是学习《Python 编程&#xff1a;从入门到实践&#xff08;第3版&#xff09;》的课后练习记录&#xff0c;主要目的是快速回顾基础知识。 练习1&#xff1a; 简单消息 将一条消息赋给变量&#xff0c;并将其…

鸿蒙 HarmonyOS - SideBarContainer 组件自学指南

在日常开发中&#xff0c;如果你有类似「左侧导航 右侧内容」的布局需求&#xff0c;比如后台管理界面、文件管理器、设置页等&#xff0c;​​SideBarContainer​​ 是非常值得掌握的组件。它自带侧边栏和主内容区的分离机制&#xff0c;还支持折叠、拖拽、控制按钮和多种显示…

CppCon 2014 学习:Practical Functional Programming

这段内容是对**在 C 中使用函数式编程&#xff08;Functional Programming, FP&#xff09;**可以做什么的简要介绍&#xff0c;下面是逐条的翻译与理解&#xff1a; Introduction 简介 在 C 中使用函数式编程&#xff08;FP&#xff09;可以做什么&#xff1f; 1. 编写强大…

飞牛NAS+Docker技术搭建个人博客站:公网远程部署实战指南

文章目录 前言1. Docker下载源设置2. Docker下载WordPress3. Docker部署Mysql数据库4. WordPress 参数设置5. 飞牛云安装Cpolar工具6. 固定Cpolar公网地址7. 修改WordPress配置文件8. 公网域名访问WordPress总结 前言 在数字化浪潮中&#xff0c;传统网站搭建方式正面临前所未…