【每日一题】 1396. 设计地铁系统

【每日一题】 1396. 设计地铁系统

避免每日太过咸鱼,一天搞定一道LeetCode算法题

一、题目描述

请你实现一个类 UndergroundSystem ,它支持以下 3 种方法:

  1. checkIn(int id, string stationName, int t)
  • 编号为 id 的乘客在 t 时刻进入地铁站 stationName 。
  • 一个乘客在同一时间只能在一个地铁站进入或者离开。
  1. checkOut(int id, string stationName, int t)
  • 编号为 id 的乘客在 t 时刻离开地铁站 stationName 。
  1. getAverageTime(string startStation, string endStation)
  • 返回从地铁站 startStation 到地铁站 endStation 的平均花费时间。
  • 平均时间计算的行程包括当前为止所有从 startStation 直接到达 endStation 的行程。
  • 调用 getAverageTime 时,询问的路线至少包含一趟行程。

你可以假设所有对 checkIn 和 checkOut 的调用都是符合逻辑的。也就是说,如果一个顾客在 t1 时刻到达某个地铁站,那么他离开的时间 t2 一定满足 t2 > t1 。所有的事件都按时间顺序给出。

提示:

  • 总共最多有 20000 次操作。

  • 1 <= id, t <= 10^6

  • 所有的字符串包含大写字母,小写字母和数字。

  • 1 <= stationName.length <= 10

  • 与标准答案误差在 10^-5 以内的结果都视为正确结果。

示例 :

输入:
["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

class UndergroundSystem {

    public UndergroundSystem() {
    }

    public void checkIn(int id, String stationName, int t) {
    }

    public void checkOut(int id, String stationName, int t) {
    }

    public double getAverageTime(String startStation, String endStation) {
    }
}

二、题解

1. 解法

解题思路:

这道题的重点在于一个乘客他进入地铁站后肯定是需要出站,且出站后,才能再次进站的,所以我就想的是他一进来我就用一个hash表存储这个用户进站的信息(站名和时间),然后当他出站的时候,就可以把他进站和出站作为key来直接算出这个进站出站所用的时间和次数。最后要获取平均时间直接取出来就行了。

static class UndergroundSystem {

        class Start {
            String station;
            int time;

            public Start(String station, int time) {
                this.station = station;
                this.time = time;
            }
        }

        class SumCount {
            int sum;
            int count;

            public SumCount(int sum, int count) {
                this.sum = sum;
                this.count = count;
            }

        }

        private Map<Integer, Start> checkInMap;
        private Map<String, SumCount> totalMap;


        public UndergroundSystem() {
            this.checkInMap = new HashMap<>(16);
            this.totalMap = new HashMap<>(16);
        }

        public void checkIn(int id, String stationName, int t) {
            checkInMap.put(id, new Start(stationName, t));
        }

        public void checkOut(int id, String stationName, int t) {
            Start start = checkInMap.get(id);
            String key = start.station + stationName;
            SumCount sumCount = totalMap.getOrDefault(key, new SumCount(0, 0));
            sumCount.sum += t - start.time;
            sumCount.count++;

            totalMap.put(key, sumCount);
        }

        public double getAverageTime(String startStation, String endStation) {
            String key = startStation + endStation;
            SumCount sumCount = totalMap.getOrDefault(key, new SumCount(0, 1));

            return 1.0 * sumCount.sum / sumCount.count;
        }
    }

题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/distance-between-bus-stops

--------------最后感谢大家的阅读,愿大家技术越来越流弊!--------------

在这里插入图片描述

--------------也希望大家给我点支持,谢谢各位大佬了!!!--------------

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值