华为2025年校招笔试手撕真题教程(二)

news2025/5/23 14:04:03

一、题目

大湾区某城市地铁线路非常密集,乘客很难一眼看出选择哪条线路乘坐比较合适,为了解决这个问题,地铁公司希望你开发一个程序帮助乘客挑选合适的乘坐线路,使得乘坐时间最短,地铁公司可以提供的数据是各相邻站点之间的乘坐时间。

解答要求

时间限制: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 heapq

class 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]:
                continue
            
            for neighbor, time in self.adjacency_list[current_station]:
                distance = current_distance + time
                if distance < distances[neighbor]:
                    distances[neighbor] = distance
                    heapq.heappush(priority_queue, (distance, neighbor))
        
        # 如果无法到达终点,返回-1或相应提示
        return distances[end] if distances[end] != float('infinity') else -1

def 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.coloradmin.cn/o/2383938.html

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

相关文章

征程 6 J6E/M linear 双int16量化支持替代方案

1.背景简介 当发现使用 plugin 精度 debug 工具定位到是某个 linear 敏感时&#xff0c;示例如下&#xff1a; op_name sensitive_type op_type L1 quant_dty…

深度学习模块缝合拼接方法套路+即插即用模块分享

前言 在深度学习中&#xff0c;模型的设计往往不是从头开始&#xff0c;而是通过组合不同的模块来构建。这种“模块缝合”技术&#xff0c;就像搭积木一样&#xff0c;把不同的功能模块拼在一起&#xff0c;形成一个强大的模型。今天&#xff0c;我们就来聊聊四种常见的模块缝…

改写视频生产流程!快手SketchVideo开源:通过线稿精准控制动态分镜的AI视频生成方案

Sketch Video 的核心特点 Sketch Video 通过手绘生成动画的形式&#xff0c;将复杂的信息以简洁、有趣的方式展现出来。其核心特点包括&#xff1a; 超强吸引力 Sketch Video 的手绘风格赋予了视频一种质朴而真实的质感&#xff0c;与常见的精致特效视频形成鲜明对比。这种独…

04-Web后端基础(基础知识)

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

Spring Cloud生态与技术选型指南:如何构建高可用的微服务系统?

引言&#xff1a;为什么选择Spring Cloud&#xff1f; 作为全球开发者首选的微服务框架&#xff0c;Spring Cloud凭借其开箱即用的组件、与Spring Boot的无缝集成&#xff0c;以及活跃的社区生态&#xff0c;成为企业级微服务架构的基石。但在实际项目中&#xff0c;如何从众多…

手写简单的tomcat

首先&#xff0c;Tomcat是一个软件&#xff0c;所有的项目都能在Tomcat上加载运行&#xff0c;Tomcat最核心的就是Servlet集合&#xff0c;本身就是HashMap。Tomcat需要支持Servlet&#xff0c;所以有servlet底层的资源&#xff1a;HttpServlet抽象类、HttpRequest和HttpRespon…

高等数学-积分

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

IOS平台Unity3D AOT全局模块结构分析

分析背景 由于IOS平台中不允许执行动态代码&#xff0c;Unity 4.6之前的版本在IOS平台中采用了AOT的处理方式&#xff0c;提前将C#代码静态编译为机器识别的二进制机器码。Unity引擎4.6之前的版本中IOS框架采用了Mono的AOT机制实现静态编译和处理&#xff0c;本文针对全局AOT模…

CyberSecAsia专访CertiK首席安全官:区块链行业亟需“安全优先”开发范式

近日&#xff0c;权威网络安全媒体CyberSecAsia发布了对CertiK首席安全官Wang Tielei博士的专访&#xff0c;双方围绕企业在进军区块链领域时所面临的关键安全风险与防御策略展开深入探讨。 Wang博士在采访中指出&#xff0c;跨链桥攻击、智能合约漏洞以及私钥管理不当&#x…

文件操作和IO-3 文件内容的读写

文件内容的读写——数据流 流是操作系统提供的概念&#xff0c;Java对操作系统的流进行了封装。 数据流就像水流&#xff0c;生生不息&#xff0c;绵延不断。 水流的特点&#xff1a;比如要100mL的水&#xff0c;可以一次接10mL&#xff0c;分10次接完&#xff0c;也可以一次接…

SpringAI 大模型应用开发篇-SpringAI 项目的新手入门知识

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 1.0 SpringAI 概述 目前大模型应用开发最常见的框架就是 LangChain&#xff0c;然而 LangChain 是基于 Python 语言&#xff0c;虽然有 LangChain4j&#xff0c;但是对于大量使…

编程速递-RAD Studio 12.3 Athens五月补丁:May Patch Available

编程速递-RAD Studio 12.3 Athens四月补丁&#xff1a;关注软件性能的开发者&#xff0c;安装此补丁十分必要 今天 &#xff08;2025 年 5 月 19 日&#xff09;Embarcadero 发布了 RAD Studio、Delphi 和 CBuilder 12.3 Athens&#xff08;雅典&#xff09;的第二个补丁。 RA…

Matlab学习合集

1.变量 2.常见的数学函数 3. 向量 向量的创建&#xff1a; 直接创建&#xff1a;针对于数量少的情况 冒号法 函数创建&#xff1a;

基于labview的声音采集与存储分析系统

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

【项目记录】部门增删改及日志技术

1 删除部门 1.1 需求 删除部门数据。在点击 "删除" 按钮&#xff0c;会根据ID删除部门数据。 了解了需求之后&#xff0c;我们再看看接口文档中&#xff0c;关于删除部门的接口的描述&#xff0c;然后根据接口文档进行服务端接口的开发。 1.2 接口描述 1.2.1 基…

TDengine 更多安全策略

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

电子制造企业智能制造升级:MES系统应用深度解析

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

Java使用Collections集合工具类

1、Collections 集合工具类 Java 中的 Collections 是一个非常有用的工具类&#xff0c;它提供了许多静态方法来操作或返回集合。这个类位于 java.util 包中&#xff0c;主要包含对集合进行操作的方法&#xff0c;比如排序、搜索、线程安全化等。 Java集合工具类的使用&#x…

python打卡day33

知识点回顾&#xff1a; PyTorch和cuda的安装查看显卡信息的命令行命令&#xff08;cmd中使用&#xff09;cuda的检查简单神经网络的流程 数据预处理&#xff08;归一化、转换成张量&#xff09;模型的定义 继承nn.Module类定义每一个层定义前向传播流程 定义损失函数和优化器定…

同城上门预约服务系统案例分享,上门服务到家系统都有什么功能?这个功能,很重要!

你以为上门按摩这类平台只要做好接单派单就万事大吉了&#xff1f;大错特错&#xff01;市面上90%的系统只会吹嘘基础功能&#xff0c;却对最关键的财税问题避而不谈。很多创业者直到被税务稽查才发现&#xff0c;自己每年都在白白多交几倍的冤枉税&#xff01;举个例子&#x…