答题笔记

题目来源:力扣(LeetCode)

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 。所有的事件都按时间顺序给出。


解题思路:这题关键就是如何计算两站间的平均时间,由于知识浅薄我能想到的就是创建一个结构体数组去记录id,入站、出站的站名和时间,以及两站间的所用时间,最后遍历结构体数组可求两站的平均时间。

代码:代码:

class UndergroundSystem {

private:

     int i=0;//记录人数

public:

    UndergroundSystem()  {

   }

    struct nums

    { 

    int number;    string start;    string end;

    int time_in;     int time_out;    int avg;

    }message[20000];

    void checkIn(int id, string stationName, int t)

    {

        message[i].number=id;

        message[i].start=stationName;

        message[i].time_in=t;

        i++;

  }

 void checkOut(int id, string stationName, int t)

    {

    for (int k=i-1;k>=0;k--)

    {  if(message[k].number==id)

      {

          message[k].time_out=t;

          message[k].end=stationName;

          message[k].avg=message[k].time_out-message[k].time_in;

          break;

      }

    }

    }

 double getAverageTime(string startStation, string endStation)

    { 

        int j=0;

        int time=0;

        for(int k=0;k

        {

            if(message[k].start==startStation)

            {

              if(message[k].end==endStation)

            { time=time+message[k].avg;

              j++;

            }

            }

        }

return 1.0*time/j;

    }

};


在实现代码提交通过后发现,执行所需的时间很长,深知这个算法不好,于是我找到了题解中一位大佬的解题思路和代码 他的思路是将起点站和终点站连起来保存。

部分代码:

 unordered_map> checkRecord;

 创建一个key为int类型(以乘客id为key),value为pair 的unordered_map,其中pair函数中第一个元素类型为string类型(入站名),第二个元素类型为int(时间)

 unordered_map> count;

 创建一个key为string类型(入站名+出战名),value为 pair 的unordered_map ,其中pair函数中第一个元素类型为double类型(存储两站间的所用时间),第二个元素类型为int(次数)

起初看到这个代码一脸懵,然后查找发现原来unordered_map是一个容器,存储的key-value的值,可以通过key快速索引到value。存储时是根据key的hash值判断元素是否相同,即unordered_map内部元素是无序的。

然后查找pair函数发现pair是将2个数据组合成一组数据,访问两个元素操作可以通过first和sencond访问,

例如:pairs1; 

s1.first=abc;

s1.second=123;

cout<

输出:abc123

通过两个unordered_map和pair,实现了对入站,出战,时间的记录。

第一次认识unordered_map和pair,我觉得我还需要去百度一下才能更好的认知。

另外大佬的完整代码请移步力扣:力扣

你可能感兴趣的:(答题笔记)