LeetCode 1396. 设计地铁系统(map/unordered_map)

1. 题目

请你实现一个类 UndergroundSystem ,它支持以下 3 种方法:

  1. checkIn(int id, string stationName, int t)

    编号为 id 的乘客在 t 时刻进入地铁站 stationName 。
    一个乘客在同一时间只能在一个地铁站进入或者离开。

  2. checkOut(int id, string stationName, int t)

    编号为 id 的乘客在 t 时刻离开地铁站 stationName 。

  3. getAverageTime(string startStation, string endStation)

返回从地铁站 startStation 到地铁站 endStation 的平均花费时间。
平均时间计算的行程包括当前为止所有从 startStation 直接到达 endStation 的行程。

调用 getAverageTime 时,询问的路线至少包含一趟行程。
你可以假设所有对 checkIn 和 checkOut 的调用都是符合逻辑的。
也就是说,如果一个顾客在 t1 时刻到达某个地铁站,那么他离开的时间 t2 一定满足 t2 > t1 。
所有的事件都按时间顺序给出。

示例:
输入:
["UndergroundSystem","checkIn","checkIn","checkIn","checkOut","checkOut","checkOut","getAverageTime",
"getAverageTime","checkIn","getAverageTime","checkOut","getAverageTime"]
[[],[45,"Leyton",3],[32,"Paradise",8],[27,"Leyton",10],[45,"Waterloo",15],[27,"Waterloo",20],[32,"Cambridge",22],["Paradise","Cambridge"],["Leyton","Waterloo"],[10,"Leyton",24],["Leyton","Waterloo"],[10,"Waterloo",38],["Leyton","Waterloo"]]输出:
[null,null,null,null,null,null,null,14.0,11.0,null,11.0,null,12.0]解释:
UndergroundSystem undergroundSystem = new UndergroundSystem();
undergroundSystem.checkIn(45, "Leyton", 3);
undergroundSystem.checkIn(32, "Paradise", 8);
undergroundSystem.checkIn(27, "Leyton", 10);
undergroundSystem.checkOut(45, "Waterloo", 15);
undergroundSystem.checkOut(27, "Waterloo", 20);
undergroundSystem.checkOut(32, "Cambridge", 22);
undergroundSystem.getAverageTime("Paradise", "Cambridge");       
// 返回 14.0。从 "Paradise"(时刻 8)到 "Cambridge"(时刻 22)的行程只有一趟
undergroundSystem.getAverageTime("Leyton", "Waterloo");          
// 返回 11.0。总共有 2 躺从 "Leyton" 到 "Waterloo" 的行程,编号为 id=45 的乘客出发于 time=3 到达于 time=15,
// 编号为 id=27 的乘客于 time=10 出发于 time=20 到达。所以平均时间为 ( (15-3) + (20-10) ) / 2 = 11.0
undergroundSystem.checkIn(10, "Leyton", 24);
undergroundSystem.getAverageTime("Leyton", "Waterloo");          
// 返回 11.0
undergroundSystem.checkOut(10, "Waterloo", 38);
undergroundSystem.getAverageTime("Leyton", "Waterloo");          
// 返回 12.0提示:
总共最多有 20000 次操作。
1 <= id, t <= 10^6
所有的字符串包含大写字母,小写字母和数字。
1 <= stationName.length <= 10
与标准答案误差在 10^-5 以内的结果都视为正确结果。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/design-underground-system
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • map1 记录起点,到终点后,更新另一个map2的信息,map1删除该条信息
class UndergroundSystem {map<vector<string>,vector<int>> station_time_n;//2个string(起点,终点);2个int(总时间,人数)map<int, pair<string,int>> id_startStation;// 乘客id;(起点,出发时刻)vector<string> s;
public:UndergroundSystem() { }void checkIn(int id, string stationName, int t) {id_startStation.insert({id,make_pair(stationName,t)});// 乘客id;(起点,出发时刻)}void checkOut(int id, string stationName, int t) {s = {id_startStation[id].first, stationName};//起点,终点if(!station_time_n.count(s))station_time_n.insert({s,{t-id_startStation[id].second,1}});else{station_time_n[s][0] += t-id_startStation[id].second;station_time_n[s][1] += 1;}id_startStation.erase(id);}double getAverageTime(string startStation, string endStation) {s = {startStation, endStation};return station_time_n[s][0]/double(station_time_n[s][1]);}
};

在这里插入图片描述

  • unordered_map key 为基本类型,C++内置的hash函数够用,不能为vector<>,需要自己写hash函数
  • 下面 pair<int,int> 不可以换成vector<int>,用[0],[1]去访问, 下面写法会报错,vector 还不知道有几个元素
class UndergroundSystem {unordered_map<string, unordered_map<string,pair<int,int>>> Station_time_n;// 起点:终点;2个int(总时间,人数)unordered_map<int, pair<string,int>> id_startStation_t;// 乘客id,(起点,出发时刻)string startStation;int time;
public:UndergroundSystem() { }void checkIn(int id, string stationName, int t) {id_startStation_t[id].first = stationName;//  乘客id,(起点,出发时刻)id_startStation_t[id].second = t;}void checkOut(int id, string stationName, int t) {startStation = id_startStation_t[id].first;time = t-id_startStation_t[id].second;Station_time_n[startStation][stationName].first += time;Station_time_n[startStation][stationName].second += 1;id_startStation_t.erase(id);}double getAverageTime(string startStation, string endStation) {return Station_time_n[startStation][endStation].first/double(Station_time_n[startStation][endStation].second);}
};
  • 需要先判断是否存在,初始化vector为 {time, 1}
class UndergroundSystem {unordered_map<string, unordered_map<string,vector<int>>> Station_time_n;// 起点:终点;2个int(总时间,人数)unordered_map<int, pair<string,int>> id_startStation_t;// 乘客id,(起点,出发时刻)string startStation;int time;
public:UndergroundSystem() { }void checkIn(int id, string stationName, int t) {id_startStation_t[id].first = stationName;//  乘客id,(起点,出发时刻)id_startStation_t[id].second = t;}void checkOut(int id, string stationName, int t) {startStation = id_startStation_t[id].first;time = t-id_startStation_t[id].second;//--------------pair<int,int> 换成 vector<int>----,区别是要先判断是否存在----------if(!Station_time_n[startStation].count(stationName))Station_time_n[startStation][stationName] = {time,1};else{Station_time_n[startStation][stationName][0] += time;Station_time_n[startStation][stationName][1] += 1;}id_startStation_t.erase(id);}double getAverageTime(string startStation, string endStation) {return Station_time_n[startStation][endStation][0]/double(Station_time_n[startStation][endStation][1]);}
};

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/476807.shtml

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

相关文章

python中object是什么数据类型_自学Python2.1-基本数据类型-字符串str(object) 上

自学Python2.1-基本数据类型-字符串str(object) 上 字符串是 Python 中最常用的数据类型。我们可以使用引号(或")来创建字符串。 创建字符串很简单&#xff0c;只要为变量分配一个值即可。例如&#xff1a; var1 Hello World! var2 "Python Runoob" 1. Python…

.NET下使用DataAdapter保存数据时,如何生成command语句及使用事务

.NET下使用DataAdapter保存数据时&#xff0c;如何生成command语句及使用事务 在.NET下&#xff0c;运用DATASET对数据进行批量更新时&#xff0c;需要与 DataAdapter配合使用。DataAdapter数据适配器的作用是生成数据更新时所需的insert,delete,update等语句&#xff0c;这些语…

文档智能SOTA被刷爆,DocVQA榜单首次突破90大关

文档智能&#xff08;DI, Document Intelligence&#xff09;主要指对于网页、数字文档或扫描文档所包含的文本以及丰富的排版格式等信息&#xff0c;通过人工智能技术进行理解、分类、提取以及信息归纳的过程。文档智能技术广泛应用于金融、保险、能源、物流、医疗等行业&…

react 遍历对象_React 源码系列 | React Children 详解

本文基于 React V16.8.6&#xff0c;本文代码地址测试代码 源码讲解React 中一个元素可能有 0 个、1 个或者多个直接子元素&#xff0c;React 导出的 Children 中包含 5 个处理子元素的方法。map 类似 array.mapforEach 类似 array.forEachcount 类似 array.lengthtoArrayonlyR…

程序员面试金典 - 面试题 16.19. 水域大小(BFS/DFS)

1. 题目 你有一个用于表示一片土地的整数矩阵 land&#xff0c;该矩阵中每个点的值代表对应地点的海拔高度。 若值为0则表示水域。由垂直、水平或对角连接的水域为池塘。 池塘的大小是指相连接的水域的个数。 编写一个方法来计算矩阵中所有池塘的大小&#xff0c;返回值需要从…

自定义组件--创建mxml组件

创建简单的mxml组件 Example components/CountryComboBox.mxml <?xml version"1.0" encoding"utf-8"?> <mx:ComboBox xmlns:mx"http://www.adobe.com/2006/mxml"> <mx:dataProvider> <mx:String>United States</mx…

19位算法工程师总结:机器学习项目成功落地的三条秘诀

文 | 天于刀刀又是一年金九银十&#xff0c;前几天小编刀刀在一次电话面试过程中被HR 的一个问题问得差点闪了腰。当时情况是这样的&#xff0c;在流利地介绍完之前的几个项目后&#xff0c;招聘小姐姐打断了我后续的&#xff08;忽悠&#xff09;节奏&#xff0c;郑重其事地反…

nodejs 获取cpu核心数量_用 NodeJS 充分利用多核 CPU 的资源[每日前端夜话0xCB]

每日前端夜话0xCA每日前端夜话&#xff0c;陪你聊前端。每天晚上18:00准时推送。正文共&#xff1a;1558 字预计阅读时间&#xff1a;7 分钟作者&#xff1a;Nick Major翻译&#xff1a;疯狂的技术宅来源&#xff1a;coderrocketfuel介绍单个 Node.js 程序的实例仅在一个线程上…

程序员面试金典 - 面试题 16.20. T9键盘(数组)

1. 题目 在老式手机上&#xff0c;用户通过数字键盘输入&#xff0c;手机将提供与这些数字相匹配的单词列表。 每个数字映射到0至4个字母。给定一个数字序列&#xff0c;实现一个算法来返回匹配单词的列表。 你会得到一张含有有效单词的列表。映射如下图所示&#xff1a; 示…

胃部不适,原来好辛苦!

这几天胃部都感觉不舒服&#xff0c;那种感觉很难形容&#xff0c;总之就非常辛苦&#xff0c;无胃口&#xff0c;浑身都不舒服&#xff0c;可能是之前几天早餐没吃饱&#xff0c;有几天很晚才入睡空着肚子的缘故吧&#xff0c;原来胃部不适是如此辛苦的&#xff0c;怕怕&#…

重磅!顶级一区期刊官宣:明年起将不再拒稿!

源 | 青塔学术、量子位等颠覆科学出版的“游戏规则”?10月20日&#xff0c;国际著名生物学综合期刊eLife官方宣布了一个重大决定&#xff1a;从2023年1月31日起&#xff0c;所有经过同行评审的文章&#xff0c;eLife都不会作出接受/拒绝的决定&#xff0c;而是直接发布在其网站…

EM(期望极大化)算法及其推广

文章目录1. EM算法2. EM算法收敛3. EM算法应用4. EM算法的推广5. sklearn.mixture.GaussianMixture概率模型有时既有观测变量&#xff08;observable variable&#xff09;&#xff0c;又有隐变量或潜在变量&#xff08;latent variable&#xff09;如果概率模型的变量都是观测…

GridView 中添加删除确认提示框

在GridView中我们可以直接添加一个CommandField删除列来删除某行信息。但为了避免误操作引起的误删除&#xff0c;在删除操作者让操作者再确认下&#xff0c;完后再进行删除。 首先我们给我们的GridView 添加一个模板列&#xff0c;如下&#xff1a; <asp:TemplateField He…

终于有人喊出来:论文一稿多投是作者的合法权利!

文 | 马建平&#xff0c;三峡大学学报编辑源 | 现代出版一稿多投目前已演变为许多作者一种常态化的投稿方式。针对一稿多投现象&#xff0c;舆论似乎是一边倒的反对和谴责之声&#xff0c;认为它浪费了极为稀缺的出版资源&#xff0c;扰乱了报刊社正常的出版秩序&#xff0c;是…

python中pop用法_Python dict pop()用法及代码示例

Python语言为几乎所有容器(无论是列表容器还是集合容器)指定了pop()。这篇特别的文章着重说明Python词典提供的pop()方法。这种方法对于经常处理字典的程序员很有用。 用法&#xff1a;dict.pop(key, def) 参数&#xff1a; key:必须返回并删除其键值对的键。 def:如果指定的键…

桩训日记

2007年2月7日 弄了一天的模拟练习&#xff0c;挺累的&#xff0c;明天估计是练习 起步停车2007年2月8日 上午起步停车&#xff08;年龄挺大的李教练&#xff09;&#xff0c;临近中午开始倒库&#xff08;挺帅的尹教练&#xff09;&#xff0c;下午继续倒库&#xff0c;基本茫然…

LeetCode 912. 排序数组(10种排序)

文章目录1. 题目2. 解题2.1 插入排序2.2 冒泡排序2.3 选择排序2.4 希尔排序2.5 归并排序2.6 快速排序2.7 堆排序2.8 计数排序2.9 桶排序2.10 基数排序3. 复杂度表1. 题目 给你一个整数数组 nums&#xff0c;将该数组升序排列。 示例 1&#xff1a; 输入&#xff1a;nums [5,…

顶会审稿人谈论文中稿“潜规则”

科研论文&#xff0c;不同于毕业论文之处在于——科研论文是根据有价值的生产实践或科研课题写作的&#xff0c;具有原创性和独到性的论文。在学术界&#xff0c;有人写论文是为了升硕士&#xff0c;升博士或者研究生博士顺利毕业。毕竟在学术界论文是工作和科研水平的直观体现…

python asyncio_如何使用Python中的asyncio?

【51CTO.com快译】Python的异步编程功能(简称async)让你可以编写不必等待独立任务完成就可以完成更多工作的程序。Python附带的asyncio库为你提供了使用async处理磁盘或网络I/O、无需其他方面等待的工具。 asyncio提供了两种处理异步操作的API&#xff1a;高级和低级。高级API用…