Leetcode 每日一题 1604. 警告一小时内使用相同员工卡大于等于三次的人(Hash表)

        Hello大家好,今天Leetcode的每日一题是1604题,题目是:警告一小时内使用相同员工卡大于等于三次的人。

        题目截图如下:

(图片来自 Leetcode)

        这道题给了我们两个数组,第一个数组是打卡的员工姓名,第二个数组给我们的是对应员工打卡的时间。我们需要找到的是在一个小时之内打卡超过三次的员工姓名。

        这道题目我们打算用的是hashTable的方式。Hashtable的结构我们也会在公众号GoyooPython的数据结构Python版栏目中详细和大家介绍,在这里我先和大家简单的介绍一下HashTable的结构(用我们这道题举例):

        如果现在的员工列表为

        ["daniel","daniel","daniel","luis","luis","luis","luis"]

        员工对应的每次出入时间列表为

        ["10:00","10:40","11:00","09:00","11:00","13:00","15:00"]

        那么我们将上面的员工列表和相对应的时间存储到我们的hashtable当中

KeyValue
daniel10:00
daniel10:40
daniel11:00
luis09:00
luis11:00
luis13:00
luis15:00

        我们可以看到Hashtable也是以键值的形式将员工的姓名,以及出入的时间记录一一对应起来的。并且在这样的数据结构中,我们通过一个key值,可以找到与这个key值相对应的value值。(此时的value值是同一个员工名字所对应的所有出入时间,所以我们判断如果有员工姓名出现了三次以上,并且有其中两个时间之差相减为>=60min的,我们就输出这个员工的姓名)。

class Solution:
    def alertNames(self, keyName: List[str], keyTime: List[str]) -> List[str]:
        # 创建一个hash表
        timeMap = defaultdict(list)
        # 分别遍历员工姓名以及出入的时间 并且转换成分钟数存入哈希表
        for name, time in zip(keyName, keyTime):
            # 提取小时 分钟
            hour, minute = int(time[:2]), int(time[3:])
            # 转换成分钟数, 方便于后面的计算
            timeMap[name].append(hour * 60 + minute)
        # 定义一个空数组 保存返回的结果,也就是员工姓名
        ans = []
        # 遍历我们刚才保存所有员工名以及他们出入时间的对应Hash表
        for name, times in timeMap.items():
        # 按照时间排序 防止顺序混乱
            times.sort()
        # 如果有一个name,这个name的时间有三个不同以上且存在时间相减>=60分钟的!
            if any(t2 - t1 <= 60 for t1, t2 in zip(times, times[2:])):
                # 添加到我们的结果集中
                ans.append(name)
        # 结果集排序
        ans.sort()
        # 返回!
        return ans

        感谢官方提供的思路,大家如果有更好的解法欢迎评论区留言!一起讨论!Go!

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值