華為開發崗暑期實習筆試(2025年4月16日)

刷題小記:

第一題懷疑測試樣例不完整,貪心法不應該能夠解決該題。第二題使用0-1BFS解決單源最短路徑的問題,往往搭配雙端隊列實現。第三題是運用動態規劃解決最大不重疊子區間個數的問題,難點在于滿足3重判斷規則,所需數據結構及相關操作較多。

1.最小測試用例集覆蓋

題目分析:

題目描述:

二維cases表示測試用例的覆蓋情況,cases[i][j]為 1 表示第i個測試用例覆蓋了第j個模塊,為 0 則表示未覆蓋。

求一個最小的測試用例集合,使得該集合能夠覆蓋所有模塊。

返回該最小的集合大小,如果不存在這樣的集合,返回-1。

輸入描述:

第一行給定兩個整數,分別表示用例總數n和代碼模塊總數m

第二行開始的n行,每行有m個整數(0或1),表示覆蓋情況。

n,m均屬于[1,50]區間

輸出描述:

輸出一個整數表示最小用例集合的大小,若不存在則輸出-1

解題思路:

當且僅當 存在j,對任意的i,均有cases[i][j] == 0時,不存在最小覆蓋集合,此時返回-1。

第i行表示第i個測試用例對m個模塊的覆蓋情況,

用一個長度為m的數組mo記錄樣例集合對模塊的覆蓋情況,其值為每一列由各樣例的對應列取并得到。

如果采用回溯法(暴力搜索),那么遍歷全部覆蓋集的時間復雜度為O(2^n),而檢查數組mo的時間復雜度為O(n),那么總的時間復雜度為O(n * 2^n),太大!

如果采用貪心法,每次選擇覆蓋模塊最多的測試樣例添入集合,仍然無法保證測試樣例集合最小。(據說真實考試情況下,該貪心法過了?!)

2.小慕的地鐵大挑戰

題目分析:

題目描述:

有N條地鐵線路,每條線路按順序連接若干站點,且一條線路上不存在重復的站點名。

地鐵乘坐規則如下:進入任意一條地鐵線路需支付2元,每換乘一次加收1元。

現求小慕從某個出發站前往指定的目的站,規劃一條最省錢的路線并返回最低票價;若不能抵達,輸出"NA"。

輸入描述:

第一行一個整數N表示地鐵線路數量,介于[1,1000]。

接下來N行,每行描述一條地鐵線路,用空格分隔若干個站點名(站點名長度不超過100個字符),最多包含100個站點。不同線路間站點名可能重復,表示是換乘站。

第N+1行包含兩個站點名,分別是出發站和目的站。

輸入保證:若存在可達路徑,則方案唯一。

輸出描述:

第一行輸出“換乘路徑”(除起始點外,只包含可能存在的換乘站點),站點之間用"-"連接。

第二行輸出該方案的總票價。

若無可達路徑,只輸出一行"NA"

解題思路:

運用0-1廣度優先搜索遍歷所有路徑,找出權值最小的路徑,其中:在線路內部移動的邊權為0,換乘時的邊權為1。

關鍵步驟:
  1. 構建狀態圖:key是(站點名,所屬線路編號),value是(下一站點,權重)的列表,其中用"虛擬線路編號-1"表示換乘口
    1. 對于同一條地鐵線路的相鄰站點(A,i)和(B,i)相連,即給(A,i)的value列表添加((B,i),0),給(B,i)的value列表添加((A,i),0)
    2. 對于每個站點,將其與對應的虛擬換乘口相連
      1. 從站點(A,i)到虛擬換乘口(A,-1)的權為1,即給(A,i)的value列表添加((A,-1),1)
      2. 從虛擬換乘口(A,-1)到站點(A,i)的權為0,即給(A,-1)的value列表添加((A,i),0)
  1. 路徑搜索算法 0-1BFS:
    1. 使用雙端隊列Deque,優先處理權值為0的邊,即將其加入隊頭(優先出隊);處理權值為1的邊時,將其加入隊尾(后出隊),已訪問過的節點直接跳過
    2. 用一個映射d記錄每個節點的最小費用,初始化為INT_MAX
    3. 用一個映射pre記錄每個節點的前置節點,以便第一次找到終點后復現路徑(權值為0的節點被優先處理,廣度優先搜索能確保找到目標點時路徑代價最小)
  1. 路徑還原與票價計算:
    1. 找到終點時,借助pre映射還原路徑,每遇到(node, -1)的節點表示為換乘節點,將其添加入路徑并記錄換乘代價
    2. 票價 = 2 + 換乘代價 - 1,因為(起點, -1)被視作了換乘節點加入路徑,而其本身是不需要換乘的,只是為了統一寫法才記為-1,因此票價公式末尾減去1
  1. 如果最終最短路徑映射d不包含終點,表示不存在能夠從起點到達該終點的路徑,輸出NA。

3.滿足盡可能多的業務需求的IP區間方案組

題目分析:

題目描述:

業務的網絡地址需求用一個閉區間[startip, endip]表示。

由于要求不同業務的IP地址區間不能重疊,要求按照一定的順序將這些業務需求排序,盡可能滿足更多的業務需求:

  • 當業務數量相同時,以IP地址占用區間最少的優先
  • 當業務數量相同時且IP地址占用區間大小也相同時,按照IP范圍排序,比較起始地址,起始地址最小者優先。
輸入描述:

第一行為業務個數N,有效范圍是[1, 1000]

接下來N行是IP地址區間,每行有startip和endip,均為合法的IPv4地址格式,即(A, B, C, D),其中ABCD的取值范圍是[0, 255]

注意:IP地址大小的比較,是按照A、B、C和D的順序進行比較。

輸出描述:

輸出排序好的M個IP區間,每行一個。

解題思路:

首先將IP地址轉換成32位的整數進行存儲,便于比較大小。

然后將這些IP區間按照startip進行升序排序,若startip相同,那么按照endip進行升序排序,得到32位轉換以及排序后的N行2列的整型數組ips。

動規五部曲:
  1. 確定dp數組以及下標的含義:dp[i]表示以第i個區間結尾的最大不重疊子區間數量
  2. 確定遞推公式:對于以j(j < i)為結尾的最大不重疊子區間方案,如果與第i個區間不重疊,那么:
    1. 如果dp[j] + 1> dp[i],那么以第i個區間為結尾的方案為在以第j個區間為結尾的最大不重疊區間數方案的基礎上加上第i個區間;
    2. 如果dp[j] + 1 == dp[i],那么比較以第i個區間為結尾的最優方案,以及以第j個區間為結尾的最優方案的基礎上添加第i個區間,比較這兩個方案的長度,選擇較短者;如果兩個方案的長度相同,比較兩個方案的起始IP地址。
  1. 確定遍歷方向:由于dp[i]依賴于dp[j](j < i),因此正序遍歷即可。
  2. dp數組初始化:遍歷第i個區間時,由于一定以第i個區間結尾,因此初始化dp[i] = 1表示將第i個區間添入業務組合方案。
import java.util.*;public class Ipv4ToIntConverter {public static int ipv4ToInt(String ipAddress) {String[] parts = ipAddress.split("\\.");int result = 0;for (int i = 0; i < 4; i++) {int octet = Integer.parseInt(parts[i]);result = (result << 8) | octet;}return result;}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();scanner.nextLine(); // 消耗掉換行符int[][] ips = new int[n][2];for (int i = 0; i < n; i++) {String[] line = scanner.nextLine().split(" ");ips[i][0] = ipv4ToInt(line[0]);ips[i][1] = ipv4ToInt(line[1]);}// 按照 startip 升序排序,如果 startip 相同,按照 endip 升序排序Arrays.sort(ips, (a, b) -> {if (a[0] == b[0]) {return Integer.compare(a[1], b[1]);}return Integer.compare(a[0], b[0]);});// dp[i] 表示以第 i 個區間結尾的最大不重疊區間數量int[] dp = new int[n];// 記錄每個狀態下選擇的區間List<List<int[]>> choices = new ArrayList<>();// 記錄每個狀態下選擇的區間的總長度int[] lengths = new int[n];for (int i = 0; i < n; i++) {dp[i] = 1;choices.add(new ArrayList<>());choices.get(i).add(ips[i]);lengths[i] = ips[i][1] - ips[i][0];for (int j = 0; j < i; j++) {if (ips[j][1] < ips[i][0]) {// 第i個區間與第j個區間不重合if (dp[j] + 1 > dp[i]) {dp[i] = dp[j] + 1;List<int[]> newChoice = new ArrayList<>(choices.get(j));newChoice.add(ips[i]);choices.set(i, newChoice);lengths[i] = lengths[j] + (ips[i][1] - ips[i][0]);} else if (dp[j] + 1 == dp[i]) {int newLength = lengths[j] + (ips[i][1] - ips[i][0]);if (newLength < lengths[i]) {List<int[]> newChoice = new ArrayList<>(choices.get(j));newChoice.add(ips[i]);choices.set(i, newChoice);lengths[i] = newLength;} else if (newLength == lengths[i]) {if (newChoice.get(0)[0] < choices.get(i).get(0)[0]) {List<int[]> newChoice = new ArrayList<>(choices.get(j));newChoice.add(ips[i]);choices.set(i, newChoice);}}}}}}// 找到最大不重疊區間數量的方案int maxCount = 0;List<int[]> bestChoice = new ArrayList<>();int minLength = Integer.MAX_VALUE;int startIp = Integer.MAX_VALUE;for (int i = 0; i < n; i++) {if (dp[i] > maxCount) {maxCount = dp[i];bestChoice = choices.get(i);minLength = lengths[i];startIp = bestChoice.get(0)[0];} else if (dp[i] == maxCount) {if (lengths[i] < minLength) {bestChoice = choices.get(i);minLength = lengths[i];startIp = bestChoice.get(0)[0];} else if (lengths[i] == minLength) {if (choices.get(i).get(0)[0] < startIp) {bestChoice = choices.get(i);startIp = bestChoice.get(0)[0];}}}}// 輸出結果for (int[] ip : bestChoice) {System.out.println(intToIpv4(ip[0]) + " " + intToIpv4(ip[1]));}scanner.close();}public static String intToIpv4(int ip) {StringBuilder sb = new StringBuilder();for (int i = 3; i >= 0; i--) {sb.append((ip >> (i * 8)) & 255);if (i > 0) {sb.append(".");}}return sb.toString();}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/78096.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/78096.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/78096.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Rust: 從內存地址信息看內存布局

內存布局其實有幾個&#xff1a;address&#xff08;地址&#xff09;、size&#xff08;大小&#xff09;、alignment&#xff08;對齊位數&#xff0c;2 的自然數次冪&#xff0c;2&#xff0c;4&#xff0c;8…&#xff09;。 今天主要從address來看內存的布局。 說明&…

每日一題算法——兩個數組的交集

兩個數組的交集 力扣題目鏈接 我的解法&#xff1a;利用數組下標。 缺點&#xff1a;當取值范圍很大時&#xff0c;浪費空間。 class Solution { public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {int count1[1001]{0…

c++ 互斥鎖

為練習c 線程同步&#xff0c;做了LeeCode 1114題. 按序打印&#xff1a; 給你一個類&#xff1a; public class Foo {public void first() { print("first"); }public void second() { print("second"); }public void third() { print("third"…

山東大學軟件學院創新項目實訓開發日志(20)之中醫知識問答自動生成對話標題bug修改

在原代碼中存在一個bug&#xff1a;當前對話的標題不是現有對話的用戶的第一段的前幾個字&#xff0c;而是歷史對話的第一段的前幾個字。 這是生成標題的邏輯出了錯誤&#xff1a; 當改成size()-1即可

WSL2-Ubuntu22.04下拉取Docker MongoDB鏡像并啟動

若未安裝docker可參考此教程&#xff1a;可以直接在wsl上安裝docker嗎&#xff0c;而不是安裝docker desktop&#xff1f;-CSDN博客 1. 拉取鏡像 docker pull mongo:latest 2.打開網絡加速&#xff0c;再次拉取鏡像 3.創建docker-compose.yml 進入vim編輯器后輸入i進行編輯&a…

中通 Redis 集群從 VM 遷移至 PVE:技術差異、PVE 優劣勢及應用場景深度解析

在數字化轉型浪潮下&#xff0c;企業對服務器資源的高效利用與成本控制愈發重視。近期&#xff0c;中通快遞將服務器上的 Redis 集群服務從 VM&#xff08;VMware 虛擬化技術&#xff09;遷移至 PVE&#xff08;Proxmox VE&#xff09;&#xff0c;這一技術舉措引發了行業廣泛關…

Prometheus+Grafana實時監控系統各項指標

一、監控架構設計 核心組件與數據流 Prometheus&#xff1a;時序數據采集、存儲與告警規則管理Node Exporter&#xff1a;采集主機指標&#xff08;CPU、內存、磁盤、網絡等&#xff09;數據庫Exporter&#xff1a;如 mysqld_exporter、postgres_exporterGrafana&#xff1a;…

[密碼學基礎]GMT 0029-2014簽名驗簽服務器技術規范深度解析

GMT 0029-2014簽名驗簽服務器技術規范深度解析 引言 在數字化轉型和網絡安全需求激增的背景下&#xff0c;密碼技術成為保障數據完整性與身份認證的核心手段。中國密碼管理局發布的GMT 0029-2014《簽名驗簽服務器技術規范》&#xff0c;為簽名驗簽服務器的設計、開發與部署提…

多路轉接select服務器

目錄 select函數原型 select服務器 select的缺點 前面介紹過多路轉接就是能同時等待多個文件描述符&#xff0c;這篇文章介紹一下多路轉接方案中的select的使用 select函數原型 #include <sys/select.h> int select(int nfds, fd_set *readfds, fd_set *writefds, f…

QT6 源(45):分隔條 QSplitter 允許程序的用戶修改布局,程序員使用 IDE時,就是分隔條的用戶,以及其 QSplitter 源代碼

&#xff08;1&#xff09; &#xff08;2&#xff09;本類的繼承關系如下&#xff0c;所以說分隔條屬于容器&#xff1a; &#xff08;3&#xff09;本類的屬性&#xff1a; &#xff08;4&#xff09; 這是一份 QSplitter 的舉例代碼&#xff0c;注意其構造函數時候的傳參&am…

VSCode PIO使用Jlink SWD燒錄Stm32

一、背景 PIO的編譯速度比Arduino快很多&#xff0c;同樣支持Arduino的語法。VScode的自動補全和插件也能夠幫助快速開發目前使用JLINK SWD的方式連接STM32 二、配置 在ini配置文件中&#xff0c;添加如下內容 [env:genericSTM32F103C8] platform ststm32 board genericS…

JavaScript 渲染內容爬取:Puppeteer 入門

在現代網絡應用中&#xff0c;許多網頁內容是通過 JavaScript 渲染生成的&#xff0c;傳統的爬蟲工具往往難以獲取這些動態內容。Puppeteer 作為一種強大的瀏覽器自動化工具&#xff0c;為這一問題提供了優雅的解決方案。本文將帶你入門 Puppeteer&#xff0c;介紹如何安裝、啟…

卷積神經網絡:視覺煉金術士的數學魔法

引言&#xff1a;當數學遇見視覺煉金術 在人工智能的奇幻世界里&#xff0c;卷積神經網絡&#xff08;CNN&#xff09;猶如掌握視覺奧秘的煉金術士&#xff0c;將原始像素的"鉛塊"淬煉成認知的"黃金"。這種融合數學嚴謹性與生物靈感的算法架構&#xff0c…

Android Cordova 開發 - Cordova 快速入門(Cordova 環境配置、Cordova 第一個應用程序)

一、Cordova 1、Cordova 概述 Cordova 是使用 HTML&#xff0c;CSS 和 JavaScript 構建混合移動應用程序的平臺 2、Cordova 特征 &#xff08;1&#xff09;命令行界面&#xff08;Cordova CLI&#xff09; 這是可用于啟動項目&#xff0c;構建不同平臺的進程&#xff0c;…

ubuntu18.04啟動不了修復

參考: 虛擬機里的Ubuntu18.4啟動時進入到grub rescue救援模式&#xff08;無法正常進入到系統&#xff09;&#xff0c;ls查看后只有一個硬盤和分區&#xff0c;且無法找到/boot/grub文件【已解決】_ubuntu grub rescue-CSDN博客 本人fdisk錯誤使用,導致了grub啟動不了 第一步…

SpringBoot3設置maven package直接打包成二進制可執行文件

注意事項 SpringBoot普通native打包順序clean compile spring-boot:process-aot native:compile 使用以下配置只會的打包順序clean package&#xff08;注意&#xff1a;使用此配置以后打包會有編譯后的class文件、jar包、original源文件、二進制可執行文件【Linux是無后綴的包…

【華為】防火墻雙擊熱備-之-主備模式-單外網線路

FW1和FW2的業務接口都工作在三層&#xff0c;上行連接二層交換機。上行交換機連接運營商的接入點&#xff0c;運營商為企業分配的IP地址為100.100.100.2。現在希望FW1和FW2以主備備份方式工作。正常情況下&#xff0c;流量通過FW1轉發&#xff1b;當FW1出現故障時&#xff0c;流…

MYSQL之表的操作

1. 創建表 語法: CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校驗規則 engine 存儲引擎; field 表示列名, datatype 表示列的類型character set 字符集, 如果沒有指定字符集, 則以所在數據庫的字符集為…

RAG進階:Chroma開源的AI原生向量數據庫

一、Chroma 核心概念與優勢 1. 什么是 Chroma&#xff1f; Chroma 是一款開源的向量數據庫&#xff0c;專為高效存儲和檢索高維向量數據設計。其核心能力在于語義相似性搜索&#xff0c;支持文本、圖像等嵌入向量的快速匹配&#xff0c;廣泛應用于大模型上下文增強&#xff0…

店匠科技摘得 36 氪“2025 AI Partner 創新大獎”

全場景 AI 方案驅動跨境電商數智化躍遷 4 月 18 日,36 氪 2025 AI Partner 大會于上海盛大開幕。大會緊扣“Super App 來了”主題,全力探尋 AI 時代的全新變量,探索 AI 領域下一個超級應用的無限可能性。在此次大會上,跨境電商獨立站 SaaS 平臺店匠科技(Shoplazza)憑借“店匠跨…