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

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

        题目截图如下:

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

(图片来自 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当中

Key Value
daniel 10:00
daniel 10:40
daniel 11:00
luis 09:00
luis 11:00
luis 13:00
luis 15: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!

 

你可能感兴趣的:(算法,Leetcode每日一题,leetcode,算法,职场和发展)