题目
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]ExplanationUndergroundSystem 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.0undergroundSystem.checkIn(10, "Leyton", 24);undergroundSystem.getAverageTime("Leyton", "Waterloo"); // return 11.0undergroundSystem.checkOut(10, "Waterloo", 38);undergroundSystem.getAverageTime("Leyton", "Waterloo"); // return 12.0
Constraints:
- There will be at most
20000operations. 1 <= id, t <= 10^6- All strings consist of uppercase, lowercase English letters and digits.
1 <= stationName.length <= 10- Answers within
10^-5of the actual value will be accepted as correct.
题意
实现一个地铁系统类的三个方法。
思路
使用两个HashMap处理:
- 第一个map记录编号id的乘客的入站信息;
- 第二个map记录线路’A-B’对应的行驶总用时和行驶次数。
代码实现
Java
class UndergroundSystem {private Map<Integer, Object[]> start;private Map<String, int[]> route;public UndergroundSystem() {start = new HashMap<>();route = new HashMap<>();}public void checkIn(int id, String stationName, int t) {start.putIfAbsent(id, new Object[2]);Object[] list = start.get(id);list[0] = stationName;list[1] = t;}public void checkOut(int id, String stationName, int t) {Object[] info = start.get(id);String routeName = (String) info[0] + '-' + stationName;int prev = (int) info[1];route.putIfAbsent(routeName, new int[2]);int[] list = route.get(routeName);list[0] += t - prev;list[1]++;}public double getAverageTime(String startStation, String endStation) {String routeName = startStation + '-' + endStation;int[] list = route.get(routeName);return 1.0 * list[0] / list[1];}}
JavaScript
var UndergroundSystem = function () {this.travel = new Map()this.record = new Map()}/*** @param {number} id* @param {string} stationName* @param {number} t* @return {void}*/UndergroundSystem.prototype.checkIn = function (id, stationName, t) {this.travel.set(id, [stationName, t])}/*** @param {number} id* @param {string} stationName* @param {number} t* @return {void}*/UndergroundSystem.prototype.checkOut = function (id, stationName, t) {const from = this.travel.get(id)[0]const to = stationNameconst interval = t - this.travel.get(id)[1]if (!this.record.has(from)) {this.record.set(from, new Map())}if (!this.record.get(from).has(to)) {this.record.get(from).set(to, [])}this.record.get(from).get(to).push(interval)this.travel.delete(id)}/*** @param {string} startStation* @param {string} endStation* @return {number}*/UndergroundSystem.prototype.getAverageTime = function (startStation, endStation) {const arr = this.record.get(startStation).get(endStation)return arr.reduce((acc, cur) => acc + cur) / arr.length}
