1396 设计地铁系统

题目描述:
请你实现一个类 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 以内的结果都视为正确结果。

方法1:
主要思路:解题链接汇总
(1)使用两个哈希作为存储的数据结构;
(2) unordered_map<int,pair<string,int>> peopel;使用上车人的id作为键,存储目前在地铁上的人的上站地点和时间;
(3)unordered_map<string,pair<int,int>> mp;使用上站和下站地点名组成的字符串作为键,存储在这两个站之间的行程时间和行程数量;

class UndergroundSystem {
    
    
public:
    unordered_map<string,pair<int,int>> mp;
    unordered_map<int,pair<string,int>> peopel;
    UndergroundSystem() {
    
    

    }
    
    void checkIn(int id, string stationName, int t) {
    
    //使用id作为键,存储此时上车的地点和时间
        peopel[id]={
    
    stationName,t};
    }
    
    void checkOut(int id, string stationName, int t) {
    
    //该人下车,则从peopel中去除此人,并将该人的行程存储到mp中
        if(peopel.count(id)){
    
    
            string key=peopel[id].first+"+"+stationName;
            if(mp.count(key)){
    
    //判断此前是否有该行程
                mp[key].first+=t-peopel[id].second;
                ++mp[key].second;
            }
            else{
    
    
                mp[key].first=t-peopel[id].second;
                mp[key].second=1;
            }
        }
    }
    //该行程的平均值
    double getAverageTime(string startStation, string endStation) {
    
    
        string key=startStation+"+"+endStation;
        return ((double)mp[key].first)/mp[key].second;
    }
};

/**
 * Your UndergroundSystem object will be instantiated and called as such:
 * UndergroundSystem* obj = new UndergroundSystem();
 * obj->checkIn(id,stationName,t);
 * obj->checkOut(id,stationName,t);
 * double param_3 = obj->getAverageTime(startStation,endStation);
 */

猜你喜欢

转载自blog.csdn.net/weixin_44171872/article/details/114010992