1396. Design Underground System
題意
-
設計一個地鐵系統,含有幾個function
-
void checkIn(int id, string stationName, int t)
id
從stationName
的進站時間t
-
void checkOut(int id, string stationName, int t)
id
從stationName
的出站時間t
-
double getAverageTime(string startStation, string endStation)
-
計算兩個站之間平均進出站花費時間
-
進出站相反的狀況,花費時間可能會不同
-
-
-
假設每次 call
getAverageTime
的時候資料都已經有了
限制
-
1 <= id, t <=
-
1 <= stationName.length, startStation.length, endStation.length <= 10
-
All strings consist of uppercase and lowercase English letters and digits.
-
There will be at most
2 *
calls in total tocheckIn
,checkOut
, andgetAverageTime
. -
Answers within of the actual value will be accepted.
題目思考
-
checkOut
被call的時間不固定,因此需要先建好id
的辨識方法以提供cheukout時可以拿到資料計算 -
每次有人
checkOut
都更新startStation - endStation
的資料供查詢
Coding流程
-
給一組
unordered_map<int, pair<string, int>> customers
,代表搭車中的乘客id ⇒ { stationName, t }
-
給一組
unordered_map<string, pair<long, int>> routes
,代表當前地圖資料-
string
為“${startStation}-${endStation}”
的字串,作為兩站之間的唯一辨識符 -
pair<long, int>
為(總花費時間, 人次)
-
-
每次
checkIn
,往customers
增加對應的進站資料 -
每次
checkOut
,取出customers
中相同id的資料,並更新routes
-
getAverageTime
,從routes
取出對應的資料並計算平均值
Solution
class UndergroundSystem {
private:
unordered_map<int, pair<string, int>> customers;
unordered_map<string, pair<long, int>> routes;
public:
UndergroundSystem() {
}
void checkIn(int id, string stationName, int t) {
customers[id] = { stationName, t };
}
void checkOut(int id, string stationName, int t) {
int time = t - customers[id].second;
string routingKey = customers[id].first + "-" + stationName;
routes[routingKey].first += time;
routes[routingKey].second += 1;
customers.erase(id);
}
double getAverageTime(string startStation, string endStation) {
string routingKey = startStation + "-" + endStation;
return (double) routes[routingKey].first / routes[routingKey].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);
*/