華為2025年校招筆試手撕真題教程(二)

一、題目

大灣區某城市地鐵線路非常密集,乘客很難一眼看出選擇哪條線路乘坐比較合適,為了解決這個問題,地鐵公司希望你開發一個程序幫助乘客挑選合適的乘坐線路,使得乘坐時間最短,地鐵公司可以提供的數據是各相鄰站點之間的乘坐時間。

解答要求

時間限制:C/C++1000ms,其他語言:2000ms內存限制:C/C++256MB,其他語言:512MB

二、分析

該問題要求開發一個程序幫助乘客選擇乘坐時間最短的地鐵線路,地鐵公司提供的數據是各相鄰站點之間的乘坐時間。這是一個典型的最短路徑問題,可以借助圖論中的算法來解決。首先,把整個地鐵網絡抽象為一個有向圖,圖中的節點代表地鐵站點,邊代表站點之間的連接(線路段),邊上的權重則表示該段的乘坐時間。對于換乘的情況,可以視為通過換乘站這一節點,將不同線路的站點連接起來,即換乘站作為一個特殊節點,其出邊可以連接到其他線路的相鄰站點,且換乘時間可以當作特殊邊的權重(若換乘需要額外時間則需考慮,否則權重為0)。

接下來,需要明確輸入數據的格式。通常,可能需要輸入站點數量、線路數量,以及每條線路的站點順序和相鄰站點之間的行駛時間。例如,對于一條包含多個站點的線路,依次給出每兩個相鄰站點之間的時間。此外,還需明確換乘站之間的換乘時間,或者默認換乘時間為0(即在換乘站直接換乘到其他線路無額外時間開銷)。針對這一問題,Dijkstra算法是一個合適的選擇。因為Dijkstra算法能夠高效地找到加權圖中兩點之間的最短路徑,假設地鐵乘坐時間都是非負的,這滿足Dijkstra算法的適用條件。

具體實現時,首先要構建圖結構。使用鄰接表或鄰接矩陣來表示圖。鄰接表在稀疏圖中更為高效,而鄰接矩陣在稠密圖中查詢速度快。對于地鐵網絡,通常站點數量較多但每個站點的相鄰站點數量有限(尤其是換乘站可能連接多條線路),所以鄰接表可能是更好的選擇。每個節點的鄰接列表中存儲了其相鄰站點以及對應的乘坐時間(權重)。然后,讀取所有線路信息以及相鄰站點時間,并構建鄰接表。對于每條線路,依次將相鄰站點之間的連接加入圖中。同時,處理換乘站之間的連接,把換乘視為從一個站點到其他線路的相鄰站點的邊(如果允許直接換乘到下一站而無需重新進站等),或者更可能的是,換乘站本身作為一個節點,其鄰接站點包括同一線路的前后站點以及其他線路在該換乘站的站點。

用戶輸入起點和終點后,程序以起點作為源節點,運行Dijkstra算法計算到各個站點的最短時間。Dijkstra算法的核心是維護一個距離數組,記錄從起點到每個節點的當前最短距離,并使用優先隊列(通常是最小堆)來選擇下一個要處理的節點。每次從優先隊列中取出距離起點最近的節點,更新其鄰接節點的距離。重復這一過程直到處理完所有節點或者找到終點為止。算法結束后,距離數組中終點對應的值即為最短乘坐時間。如果終點不可達(距離仍為初始的無窮大值),則輸出無法到達。

此外,需要考慮效率問題。因為地鐵線路可能非常密集,站點數量龐大,所以算法的時間復雜度和空間復雜度需要控制在合理范圍內。Dijkstra算法的時間復雜度在使用優先隊列實現時為O(M + N log N),其中M是邊數,N是節點數。對于大規模的地鐵網絡,這應該是可行的,但需要確保數據結構的高效性,例如使用堆優化的Dijkstra算法。

可能的難點在于處理換乘情況。換乘實際上涉及多個線路之間的連接,需要確保圖的構建能夠正確反映換乘關系。例如,當乘客在換乘站換乘到另一條線路時,該換乘是否算作一個站點到另一個站點的邊,還是換乘站作為一個中間節點連接不同線路的站點。一般來說,更合理的模型是將換乘站視為一個節點,其連接同一線路的前后站點以及不同線路在該換乘站的站點。例如,換乘站S屬于線路A和線路B,那么在圖中,S會有邊連接到線路A的前一站和后一站,以及線路B的前一站和后一站,邊的權重分別為對應的行駛時間。

另外,輸入數據的處理需要仔細設計。例如,每條線路的站點可能以順序給出,相鄰站點之間的時間依次給出。需要將這些信息正確地轉換為圖中的邊。例如,對于線路站點列表[S1, S2, S3, ..., Sn]和時間列表[t1, t2, ..., t(n-1)],則S1到S2的時間是t1,S2到S3的時間是t2,依此類推。同時,如果是雙向線路(地鐵通常是雙向運行的),則需要為每個方向都添加邊,即S2到S1的時間也是t1,除非題目說明線路是單向的。

三、代碼

由于目前無法確定具體的輸入數據格式和細節(如站點如何標識、換乘站的表示方式等),我將基于常見的輸入方式提供一個通用的示例代碼。以下代碼使用Python實現,并基于Dijkstra算法。

import sys
import heapqclass MetroNetwork:def __init__(self):self.adjacency_list = {}def add_station(self, station):if station not in self.adjacency_list:self.adjacency_list[station] = []def add_connection(self, from_station, to_station, time):self.adjacency_list[from_station].append((to_station, time))def dijkstra(self, start, end):# 初始化距離字典distances = {station: float('infinity') for station in self.adjacency_list}distances[start] = 0# 優先隊列,存儲(距離,節點)priority_queue = [(0, start)]while priority_queue:current_distance, current_station = heapq.heappop(priority_queue)# 如果已經到達終點,可以直接返回if current_station == end:return current_distance# 如果當前距離大于已知的最短距離,則跳過if current_distance > distances[current_station]:continuefor neighbor, time in self.adjacency_list[current_station]:distance = current_distance + timeif distance < distances[neighbor]:distances[neighbor] = distanceheapq.heappush(priority_queue, (distance, neighbor))# 如果無法到達終點,返回-1或相應提示return distances[end] if distances[end] != float('infinity') else -1def main():# 讀取輸入input_lines = sys.stdin.read().splitlines()# 第一行是站點和線路信息# 假設第一行是站點數和線路數,接下來是線路的站點和時間信息# 這里需要根據實際輸入格式調整# 示例輸入格式(僅供參考):# 第一行:2  # 表示兩個站點# 第二行:3  # 表示三條線路# 接下來每行是一條線路的站點和時間,如:A B 5 表示A到B需要5分鐘# ...# 這里需要根據實際輸入格式調整metro = MetroNetwork()# 這里是一個簡單的示例,實際需要根據輸入格式調整for line in input_lines[1:]:  # 跳過第一行parts = line.strip().split()if len(parts) >= 3:from_station = parts[0]to_station = parts[1]time = int(parts[2])metro.add_station(from_station)metro.add_station(to_station)metro.add_connection(from_station, to_station, time)# 如果是雙向的,添加反向連接metro.add_connection(to_station, from_station, time)# 用戶輸入起點和終點start_station = input("請輸入起點站點: ")end_station = input("請輸入終點站點: ")# 找到最短路徑時間shortest_time = metro.dijkstra(start_station, end_station)if shortest_time != -1:print(f"從{start_station}到{end_station}的最短乘坐時間是: {shortest_time} 分鐘")else:print("無法到達目的地")if __name__ == "__main__":main()

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

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

相關文章

SAP ABAP VK11/VK12 創建銷售物料價格(附源碼)

需求: 通過接口批量創建銷售物料的價格(含階梯價),對應事務碼VK11/VK12 方法:(會在下面源碼寫出各個方法的優缺點,僅供參考) 通過函數 RV_CONDITION_COPY創建(目前最優)通過函數 BAPI_PRICES_CONDITIONS通過BDC錄屏使用VK11事務碼進行創建分析: 通過測試可發現,VK…

噪聲建模在一小時:最小化準備工作的自監督低光RAW圖像去噪

論文標題: Noise Modeling in One Hour: Minimizing Preparation Efforts for Self-supervised Low-Light RAW Image Denoising發表日期: 2025年5月作者: Feiran Li, Haiyang Jiang*, Daisuke Iso發表單位: Sony Research, Tokyo University原文鏈接: https://arxiv.org/pdf/25…

Puppeteer 瀏覽器自動化操作工具

pyppeteer 是 Python 版本的 Puppeteer&#xff0c;而 Puppeteer 是由 Google 開發的一個 Node.js 庫&#xff0c;用于控制 Chrome 或 Chromium 瀏覽器。pyppeteer 允許你通過 Python 代碼自動化操作瀏覽器&#xff0c;實現網頁爬取、自動化測試、生成截圖或 PDF 等功能。 核心…

接口性能測試-工具JMeter的學習

接口登錄鏈接http://111.230.19.204:8080/blog_login.html 一、JMeter基本使用流程 1、啟動Jmeter 2、在“測試計劃”下添加線程組 3、在“線程組”下添加“HTTP”取樣器 4、填寫“HTTP請求”的相關請求數據 5、在“線程組”下添加“查看結果樹”監聽器 6、點擊“啟動”按鈕…

mybatis-plus與jsqlparser共用時報sql解析錯誤

手動引入jsqlparser-4.6版本&#xff0c;但mybatis-plus中引用為4.4版本 解決方法一&#xff1a; jsqlparser版本與mybatis-plus中引用版本一致。 解決方法而二&#xff1a; 排除掉mybatis-plus中的jsqlparser。

用MMdetection框架訓練自己的數據集(全流程實戰)

前面我們準備好了COCO格式的數據集&#xff1a;將YOLO格式的數據集轉換為mmdetection格式-CSDN博客https://blog.csdn.net/qq_54708219/article/details/148224187?spm1001.2014.3001.5501 下面我們使用MMdetection開始訓練。 1.創建新的數據集類 首先&#xff0c;在mmdet/d…

VS Code中Maven未能正確讀取`settings.xml`中配置的新路徑

在VS Code中Maven未能正確讀取settings.xml中配置的新路徑&#xff0c;通常是由于以下原因導致的&#xff1a; 一、VS Code未使用你修改的settings.xml文件 VS Code的Maven插件可能使用了默認配置或指向其他settings.xml文件。解決方法&#xff1a; 手動指定settings.xml路徑…

2021年認證杯SPSSPRO杯數學建模A題(第二階段)醫學圖像的配準全過程文檔及程序

2021年認證杯SPSSPRO杯數學建模 A題 醫學圖像的配準 原題再現&#xff1a; 圖像的配準是圖像處理領域中的一個典型問題和技術難點&#xff0c;其目的在于比較或融合同一對象在不同條件下獲取的圖像。例如為了更好地綜合多種信息來辨識不同組織或病變&#xff0c;醫生可能使用…

RPM之(1)基礎使用

RPM之(1)基礎使用 Author: Once Day Date: 2025年5月26日 一位熱衷于Linux學習和開發的菜鳥&#xff0c;試圖譜寫一場冒險之旅&#xff0c;也許終點只是一場白日夢… 漫漫長路&#xff0c;有人對你微笑過嘛… 全系列文章可參考專欄: Linux實踐記錄_Once-Day的博客-CSDN博客 …

國內可做大批量pcb的工廠有哪些?

在電子產業升級浪潮中&#xff0c;PCB作為電子設備的基礎載體&#xff0c;其批量生產能力直接決定著終端產品的市場響應速度與品質穩定性。本文精選五家具備核心競爭力的廠商&#xff0c;從工藝深度、產能規模到服務模式展開剖析&#xff0c;為采購決策提供專業參考。 獵板PCB…

【視頻】使用海康SDK保存的MP4無法在瀏覽器(html5)中播放

1、問題描述 在使用海康 SDK 的 NET_DVR_SaveRealData 接口&#xff0c;將視頻流保存成MP4文件后&#xff0c;通過瀏覽器無法播放MP4&#xff0c;播放其它的MP4正常。 2、原因分析 對比可以正常播放的MP4 和 無法播放的MP4文件&#xff0c;比較它們的詳細信息&#xff0c;發…

AI時代新詞-生成對抗網絡(GAN)

一、什么是生成對抗網絡&#xff08;GAN&#xff09;&#xff1f; 生成對抗網絡&#xff08;Generative Adversarial Network&#xff0c;簡稱GAN&#xff09;是一種由生成器&#xff08;Generator&#xff09;和判別器&#xff08;Discriminator&#xff09;組成的深度學習模…

使用AutoKeras2.0的AutoModel進行結構化數據回歸預測

1、First of All: Read The Fucking Source Code import autokeras as ak import numpy as np from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error# 生成數據集 np.random.seed(42) x np.random.rand(1000, 10) # 生成1…

實戰設計模式之訪問者模式

概述 訪問者模式允許我們在不改變類的前提下&#xff0c;向已有類添加新的功能。簡單來說&#xff0c;就是將算法與對象的數據結構進行分離的一種方法。在實際應用中&#xff0c;當我們需要對一組對象執行一些操作&#xff0c;而這些操作又需要隨著需求的變化而不斷變化時&…

centos7.9使用docker-compose安裝kafka

docker-compose配置文件 services:zookeeper:image: confluentinc/cp-zookeeper:7.0.1hostname: zookeepercontainer_name: zookeeperports:- "2181:2181"environment:ZOOKEEPER_CLIENT_PORT: 2181ZOOKEEPER_TICK_TIME: 2000kafka:image: confluentinc/cp-kafka:7.0…

STM32:Modbus通信協議核心解析:關鍵通信技術

知識點1【 Modbus通信】 1、Modbus的概述 Modbus是OSI模型第七層的應用層報文傳輸協議 協議&#xff1a;說明有組包和解包的過程 2、通信機制 Modelbus是一個請求/應答協議 通信機制&#xff1a;主機輪詢&#xff0c;從機應答的機制。每個從設備有唯一的地址&#xff0c;主…

LeetCode 3362.零數組變換 III:貪心+優先隊列+差分數組——清晰題解

【LetMeFly】3362.零數組變換 III&#xff1a;貪心優先隊列差分數組——清晰題解 力扣題目鏈接&#xff1a;https://leetcode.cn/problems/zero-array-transformation-iii/ 給你一個長度為 n 的整數數組 nums 和一個二維數組 queries &#xff0c;其中 queries[i] [li, ri] …

ORM++ 封裝實戰指南:安全高效的 C++ MySQL 數據庫操作

ORM 封裝實戰指南&#xff1a;安全高效的 C MySQL 數據庫操作 一、環境準備 1.1 依賴安裝 # Ubuntu/Debian sudo apt-get install libmysqlclient-dev # CentOS sudo yum install mysql-devel# 編譯時鏈接庫 (-I 指定頭文件路徑 -L 指定庫路徑) g main.cpp -stdc17 -I/usr/i…

JESD204B 協議介紹

一、協議概述 JESD204B是由JEDEC&#xff08;固態技術協會&#xff09;制定的高速串行接口標準&#xff0c;專為模數轉換器&#xff08;ADC&#xff09;、數模轉換器&#xff08;DAC&#xff09;與邏輯器件&#xff08;如FPGA、ASIC&#xff09;之間的數據傳輸設計。其核心目標…

yolov8,c++案例匯總

文章目錄 引言多目標追蹤案例人體姿態估計算法手勢姿態估計算法目標分割算法 引言 以下案例,基于c,ncnn,yolov8既可以在windows10/11上部署, 也可以在安卓端部署, 也可以在嵌入式端部署, 服務器端可支持部署封裝為DLL,支持c/c#/java端調用 多目標追蹤案例 基于yolov8, ncnn,…