LeetCode 1396. Design Underground System設計地鐵系統【Medium】【Python】【設計】
Problem
Implement the class UndergroundSystem
that supports three methods:
1.checkIn(int id, string stationName, int t)
- A customer with id card equal to
id
, gets in the stationstationName
at timet
. - A customer can only be checked into one place at a time.
2.checkOut(int id, string stationName, int t)
- A customer with id card equal to
id
, gets out from the stationstationName
at timet
.
3.getAverageTime(string startStation, string endStation)
- Returns the average time to travel between the
startStation
and theendStation
. - The average time is computed from all the previous traveling from
startStation
toendStation
that happened directly. - Call to
getAverageTime
is always valid.
You can assume all calls to checkIn
and checkOut
methods are consistent. That is, if a customer gets in at time t1 at some station, then it gets out at time t2 with t2 > t1. All events happen in chronological order.
Example 1:
Input
["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"]]
Output
[null,null,null,null,null,null,null,14.0,11.0,null,11.0,null,12.0]
Explanation
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"); // return 14.0. There was only one travel from "Paradise" (at time 8) to "Cambridge" (at time 22)
undergroundSystem.getAverageTime("Leyton", "Waterloo"); // return 11.0. There were two travels from "Leyton" to "Waterloo", a customer with id=45 from time=3 to time=15 and a customer with id=27 from time=10 to time=20. So the average time is ( (15-3) + (20-10) ) / 2 = 11.0
undergroundSystem.checkIn(10, "Leyton", 24);
undergroundSystem.getAverageTime("Leyton", "Waterloo"); // return 11.0
undergroundSystem.checkOut(10, "Waterloo", 38);
undergroundSystem.getAverageTime("Leyton", "Waterloo"); // return 12.0
Constraints:
- There will be at most
20000
operations. 1 <= id, t <= 10^6
- All strings consist of uppercase, lowercase English letters and digits.
1 <= stationName.length <= 10
- Answers within
10^-5
of the actual value will be accepted as correct.
問題
請你實現一個類 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 以內的結果都視爲正確結果。
思路
設計題
字典存儲到站離站乘客
字典的 key 是站臺名,value 是二維列表 [id, t]
Python3代碼
class UndergroundSystem:
def __init__(self):
self.enterstation = {}
self.leavestation = {}
def checkIn(self, id: int, stationName: str, t: int) -> None:
if stationName not in self.enterstation:
self.enterstation[stationName] = [[id, t]]
else:
self.enterstation[stationName].append([id, t])
def checkOut(self, id: int, stationName: str, t: int) -> None:
if stationName not in self.leavestation:
self.leavestation[stationName] = [[id, t]]
else:
self.leavestation[stationName].append([id, t])
def getAverageTime(self, startStation: str, endStation: str) -> float:
res = []
start = self.enterstation[startStation]
end = self.leavestation[endStation]
for i in start:
for j in end:
# id相同
if i[0] == j[0]:
res.append(abs(j[1] - i[1]))
return float(sum(res) / len(res))
# Your UndergroundSystem object will be instantiated and called as such:
# obj = UndergroundSystem()
# obj.checkIn(id,stationName,t)
# obj.checkOut(id,stationName,t)
# param_3 = obj.getAverageTime(startStation,endStation)