1396. Design Underground System
https://leetcode.com/problems/design-underground-system/
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 stationstationNameat 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 stationstationNameat timet.
3. getAverageTime(string startStation, string endStation)
Returns the average time to travel between the
startStationand theendStation.The average time is computed from all the previous traveling from
startStationtoendStationthat happened directly.Call to
getAverageTimeis 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.0Constraints:
There will be at most
20000operations.1 <= id, t <= 10^6All strings consist of uppercase, lowercase English letters and digits.
1 <= stationName.length <= 10Answers within
10^-5of the actual value will be accepted as correct.
设计简易进出站统计系统,分别实现:checkIn(t, s, u)表示用户u在t时刻进s站,checkOut(t, s, u)表示出站,getAvgTime(s1, s2)统计所有直接从s1到s2站的旅客平均花费时间。需要统计s1到s2的旅客平均时间,因此用dict s[s1][s2]记录从s1到s2的总时间和总人数。再用dict u记录用户何时进出何站。
class UndergroundSystem:
def __init__(self):
self.s, self.u = {}, {}
def checkIn(self, id: int, sn: str, t: int) -> None:
self.u[id] = [sn, t]
def checkOut(self, id: int, sn: str, t: int) -> None:
s, u = self.s, self.u
st, t0 = u[id][0], u[id][1]
if st not in s:
s[st] = {}
if sn not in s[st]:
# (total time, total users)
s[st][sn] = [0, 0]
s[st][sn][0] += t - t0
s[st][sn][1] += 1
u[id] = None
def getAverageTime(self, start: str, end: str) -> float:
return float(self.s[start][end][0]) / float(self.s[start][end][1])
# 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)Last updated
Was this helpful?