請你實現一個類 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
以內的結果都視爲正確結果。
C++
class UndergroundSystem {
public:
UndergroundSystem()
{
}
void checkIn(int id, string stationName, int t)
{
tmp[id]=make_pair(stationName,t);
}
void checkOut(int id, string stationName, int t)
{
int duration=t-tmp[id].second;
auto it=make_pair(tmp[id].first,stationName);
if(time.find(it)==time.end())
{
time[it]=make_pair(duration,1);
}
else
{
time[it].first+=duration;
time[it].second++;
}
tmp.erase(id);
}
double getAverageTime(string startStation, string endStation)
{
auto it=make_pair(startStation,endStation);
return (double)time[it].first/time[it].second;
}
private:
map<int,pair<string,int>> tmp;
map<pair<string,string>,pair<int,int>> time;
};
/**
* 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);
*/