zoukankan      html  css  js  c++  java
  • 1396. Design Underground System (M)

    Design Underground System (M)

    题目

    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 station stationName at time t.
    • 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 station stationName at time t.

    3.getAverageTime(string startStation, string endStation)

    • Returns the average time to travel between the startStation and the endStation.
    • The average time is computed from all the previous traveling from startStation to endStation 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.

    题意

    实现一个地铁系统类的三个方法。

    思路

    使用两个HashMap处理:

    1. 第一个map记录编号id的乘客的入站信息;
    2. 第二个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 = stationName
      const 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
    }
    
  • 相关阅读:
    TimelineJS JSON 数据格式
    FFMS2 API 译文 [原创]
    用 Delphi 7 实现基于 FFMS2 的视频转 GIF 工具 [原创]
    FFMS2 官方说明译文 [原创]
    华为悦盒 EC6108V9U 破解过程全记录(root扫盲) [原创]
    Delphi 中的 RectTracker
    Delphi 7中对StretchBlt, StretchDIBits, DrawDibDraw, BitBlt 的性能测试
    【最后一篇API译文】Android开发-API指南- Contacts Provider
    Android开发-API指南- Calendar Provider
    Android开发-API指南-数据存储
  • 原文地址:https://www.cnblogs.com/mapoos/p/14561002.html
Copyright © 2011-2022 走看看