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当中
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!