華為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
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/83186.shtml
英文地址,請注明出處:http://en.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;傳統網站搭建方式正面臨前所未…