华为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()
相关文章:

华为2025年校招笔试手撕真题教程(二)
一、题目 大湾区某城市地铁线路非常密集,乘客很难一眼看出选择哪条线路乘坐比较合适,为了解决这个问题,地铁公司希望你开发一个程序帮助乘客挑选合适的乘坐线路,使得乘坐时间最短,地铁公司可以提供的数据是各相邻站点…...

征程 6 J6E/M linear 双int16量化支持替代方案
1.背景简介 当发现使用 plugin 精度 debug 工具定位到是某个 linear 敏感时,示例如下: op_name sensitive_type op_type L1 quant_dty…...

深度学习模块缝合拼接方法套路+即插即用模块分享
前言 在深度学习中,模型的设计往往不是从头开始,而是通过组合不同的模块来构建。这种“模块缝合”技术,就像搭积木一样,把不同的功能模块拼在一起,形成一个强大的模型。今天,我们就来聊聊四种常见的模块缝…...

改写视频生产流程!快手SketchVideo开源:通过线稿精准控制动态分镜的AI视频生成方案
Sketch Video 的核心特点 Sketch Video 通过手绘生成动画的形式,将复杂的信息以简洁、有趣的方式展现出来。其核心特点包括: 超强吸引力 Sketch Video 的手绘风格赋予了视频一种质朴而真实的质感,与常见的精致特效视频形成鲜明对比。这种独…...
Graphics——基于.NET 的 CAD 图形预览技术研究与实现——CAD c#二次开发
一、Graphics 类的本质与作用 Graphics 是 .NET 框架中 System.Drawing 命名空间下的核心类,用于在二维画布(如 Bitmap 图像)上绘制图形、文本或图像。它相当于 “绘图工具”,提供了一系列方法(如 DrawLine、FillElli…...
ElasticSearch 8.x 快速上手并了解核心概念
目录 核心概念概念总结 常见操作索引的常见操作常见的数据类型指定索引库字段类型mapping查看索引库的字段类型最高频使用的数据类型 核心概念 在新版Elasticsearch中,文档document就是一行记录(json),而这些记录存在于索引库(index)中, 索引名称必须是…...
AI神经网络降噪 vs 传统单/双麦克风降噪的核心优势对比
1. 降噪原理的本质差异 对比维度传统单/双麦克风降噪AI神经网络降噪技术基础基于固定规则的信号处理(如谱减法、维纳滤波)基于深度学习的动态建模(DNN/CNN/Transformer)噪声样本依赖预设有限噪声类型训练数据覆盖数十万种真实环境…...

04-Web后端基础(基础知识)
而像HTML、CSS、JS 以及图片、音频、视频等这些资源,我们都称为静态资源。 所谓静态资源,就是指在服务器上存储的不会改变的数据,通常不会根据用户的请求而变化。 那与静态资源对应的还有一类资源,就是动态资源。那所谓动态资源&…...

Spring Cloud生态与技术选型指南:如何构建高可用的微服务系统?
引言:为什么选择Spring Cloud? 作为全球开发者首选的微服务框架,Spring Cloud凭借其开箱即用的组件、与Spring Boot的无缝集成,以及活跃的社区生态,成为企业级微服务架构的基石。但在实际项目中,如何从众多…...

手写简单的tomcat
首先,Tomcat是一个软件,所有的项目都能在Tomcat上加载运行,Tomcat最核心的就是Servlet集合,本身就是HashMap。Tomcat需要支持Servlet,所以有servlet底层的资源:HttpServlet抽象类、HttpRequest和HttpRespon…...

高等数学-积分
一、不定积分 定理:如果函数f(x)在区间I上连续,那么f(x)在区间I上一定有原函数,即一定存在区间I上的可导函数F(x),使得F(x)f(x) ,x∈I 简单地说:连续函数必有原函数。 极限lim*0->x {[∫*0^x sin(t^2)…...

IOS平台Unity3D AOT全局模块结构分析
分析背景 由于IOS平台中不允许执行动态代码,Unity 4.6之前的版本在IOS平台中采用了AOT的处理方式,提前将C#代码静态编译为机器识别的二进制机器码。Unity引擎4.6之前的版本中IOS框架采用了Mono的AOT机制实现静态编译和处理,本文针对全局AOT模…...
Vue 3.0中自定义指令
自定义指令是增强 Vue 组件的重要手段。常见的内置指令有: v-if、v-show、v-model、v-bind、v-on等。 本文将详细讲解如何创建和使用自定义指令,关注以下几个关键点: 1. 指令的钩子函数:类似于生命周期钩子函数。 2. 指令钩子函…...
在 语义分割 和 图像分类 任务中,image、label 和 output 的形状会有所不同。
1. 图像分类 (Image Classification) 图像分类 任务是将整个图像分类为一个类别。通常,output 是对整个图像的类别的预测,而 label 是该图像的真实类别。 1.1 image 的形状 image 是输入图像数据,通常是一个四维张量: 形状&…...
C++面试4-sizeof解析
C++sizeof关键字的深度解析 一、本质认知:编译器的尺度 1. 编译期操作符的基因 int arr[5]; cout << sizeof(arr); // 输出20(假设int为4字节)非运行时特性:在编译阶段完成计算,不会生成任何机器指令表达式不求值:sizeof(++i)不会改变i的值类型感知:对类型名使…...

CyberSecAsia专访CertiK首席安全官:区块链行业亟需“安全优先”开发范式
近日,权威网络安全媒体CyberSecAsia发布了对CertiK首席安全官Wang Tielei博士的专访,双方围绕企业在进军区块链领域时所面临的关键安全风险与防御策略展开深入探讨。 Wang博士在采访中指出,跨链桥攻击、智能合约漏洞以及私钥管理不当&#x…...
uniapp如何设置uni.request可变请求ip地址
文章目录 简介方法一:直接在请求URL中嵌入变量方法二:使用全局变量方法三:使用环境变量方法四:服务端配置方法五:使用配置文件(如config.js):总结 简介 在uni-app中,uni.request 用…...

文件操作和IO-3 文件内容的读写
文件内容的读写——数据流 流是操作系统提供的概念,Java对操作系统的流进行了封装。 数据流就像水流,生生不息,绵延不断。 水流的特点:比如要100mL的水,可以一次接10mL,分10次接完,也可以一次接…...
架构的设计
搭建架构的最低前提 1.设计清晰: 需求文档: 有哪些界面 每个界面提够了哪些功能 这些功能是怎样操作的 会有哪些反馈 2.技术: 写架构的同学:这次项目设计的技术 都要有料及(用到的技术有哪些特点 有哪些缺点&…...

SpringAI 大模型应用开发篇-SpringAI 项目的新手入门知识
🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 1.0 SpringAI 概述 目前大模型应用开发最常见的框架就是 LangChain,然而 LangChain 是基于 Python 语言,虽然有 LangChain4j,但是对于大量使…...

编程速递-RAD Studio 12.3 Athens五月补丁:May Patch Available
编程速递-RAD Studio 12.3 Athens四月补丁:关注软件性能的开发者,安装此补丁十分必要 今天 (2025 年 5 月 19 日)Embarcadero 发布了 RAD Studio、Delphi 和 CBuilder 12.3 Athens(雅典)的第二个补丁。 RA…...
Vue3实现轮播表(表格滚动)
在这之前,写过一篇Vue2实现该效果的博文:vue-seamless-scroll(一个简单的基于vue.js的无缝滚动) 有兴趣也可以去看下,这篇是用vue3实现,其实很简单,目的是方便后面用到直接复制既可以了。 安装: <...
Python爬虫(33)Python爬虫高阶:动态页面破解与验证码OCR识别全流程实战
目录 一、技术背景与行业痛点二、核心技术与实现路径2.1 动态页面处理方案对比2.2 Selenium深度集成实践2.3 OCR验证码破解方案1. 预处理阶段:2. 识别阶段:3. 后处理阶段 三、典型应用场景解析3.1 电商价格监控系统1. 技术架构2. 实现效果 3.2 社交媒体舆…...

Matlab学习合集
1.变量 2.常见的数学函数 3. 向量 向量的创建: 直接创建:针对于数量少的情况 冒号法 函数创建:...

基于labview的声音采集与存储分析系统
基于LabVIEW的声音信号采集与存储分析系统开发实战:从原理到代码实现 (内含源码)基于labview的声音采集与处理系统 点击跳转工坊 点击跳转视频 引言 在音频技术与工业监测领域,声音信号的实时采集与分析是一项基础且关键的任务。…...

【项目记录】部门增删改及日志技术
1 删除部门 1.1 需求 删除部门数据。在点击 "删除" 按钮,会根据ID删除部门数据。 了解了需求之后,我们再看看接口文档中,关于删除部门的接口的描述,然后根据接口文档进行服务端接口的开发。 1.2 接口描述 1.2.1 基…...

TDengine 更多安全策略
简介 上一节我们介绍了 TDengine 安全部署配置建议,除了传统的这些配置外,TDengine 还有其他的安全策略,例如 IP 白名单、审计日志、数据加密等,这些都是 TDengine Enterprise 特有功能,其中白名单功能在 3.2.0.0 版本…...

电子制造企业智能制造升级:MES系统应用深度解析
在全球电子信息产业深度变革的2025年,我国电子信息制造业正经历着增长与转型的双重考验。据权威数据显示,2025年一季度行业增加值同比增长11.5%,但智能手机等消费电子产量同比下降1.1%,市场竞争白热化趋势显著。叠加关税政策调整、…...

Java使用Collections集合工具类
1、Collections 集合工具类 Java 中的 Collections 是一个非常有用的工具类,它提供了许多静态方法来操作或返回集合。这个类位于 java.util 包中,主要包含对集合进行操作的方法,比如排序、搜索、线程安全化等。 Java集合工具类的使用&#x…...
磁盘空间不足,迁移Docker 数据目录
停止 Docker 服务。 sudo systemctl stop docker 将现有的 Docker 数据移动到新位置(例如 /home/docker-data)。 sudo mv /var/lib/docker /home/docker-data 在原位置创建一个指向新位置的符号链接。 sudo ln -s /home/docker-data /var/lib/dock…...