Python leetcode 2933 高访问员工,力扣练习,哈希表,列表排序,代码实战

leetcode 2933 高访问员工

1.题目描述

给你一个长度为 n 、下标从 0 开始的二维字符串数组 access_times 。对于每个 i0 <= i <= n - 1 ),access_times[i][0] 表示某位员工的姓名,access_times[i][1] 表示该员工的访问时间。access_times 中的所有条目都发生在同一天内。

访问时间用 四位 数字表示, 符合 24 小时制 ,例如 "0800" 或 "2250" 。

如果员工在 同一小时内 访问系统 三次或更多 ,则称其为 高访问 员工。

时间间隔正好相差一小时的时间  被视为同一小时内。例如,"0815" 和 "0915" 不属于同一小时内。

一天开始和结束时的访问时间不被计算为同一小时内。例如,"0005" 和 "2350" 不属于同一小时内。

以列表形式,按任意顺序,返回所有 高访问 员工的姓名。

示例 1:

输入:access_times = [["a","0549"],["b","0457"],["a","0532"],["a","0621"],["b","0540"]]
输出:["a"]
解释:"a" 在时间段 [05:32, 06:31] 内有三条访问记录,时间分别为 05:32 、05:49 和 06:21 。
但是 "b" 的访问记录只有两条。
因此,答案是 ["a"] 。

示例 2:

输入:access_times = [["d","0002"],["c","0808"],["c","0829"],["e","0215"],["d","1508"],["d","1444"],["d","1410"],["c","0809"]]
输出:["c","d"]
解释:"c" 在时间段 [08:08, 09:07] 内有三条访问记录,时间分别为 08:08 、08:09 和 08:29 。
"d" 在时间段 [14:10, 15:09] 内有三条访问记录,时间分别为 14:10 、14:44 和 15:08 。
然而,"e" 只有一条访问记录,因此不能包含在答案中,最终答案是 ["c","d"] 。

示例 3:

输入:access_times = [["cd","1025"],["ab","1025"],["cd","1046"],["cd","1055"],["ab","1124"],["ab","1120"]]
输出:["ab","cd"]
解释:"ab"在时间段 [10:25, 11:24] 内有三条访问记录,时间分别为 10:25 、11:20 和 11:24 。
"cd" 在时间段 [10:25, 11:24] 内有三条访问记录,时间分别为 10:25 、10:46 和 10:55 。
因此,答案是 ["ab","cd"] 。

提示:

  • 1 <= access_times.length <= 100
  • access_times[i].length == 2
  • 1 <= access_times[i][0].length <= 10
  • access_times[i][0] 仅由小写英文字母组成。
  • access_times[i][1].length == 4
  • access_times[i][1] 采用24小时制表示时间。
  • access_times[i][1] 仅由数字 '0' 到 '9' 组成。

2.题目解析

代码1

1.创建一个字典:key为name,value为time的列表

2.循环每个name的time列表,排序,然后计算t[i]-t[i-2],如果存在t[i]-t[i-2] <60,则符合条件,将name添加到结果res列表中。

class Solution:
    def findHighAccessEmployees(self, access_times: List[List[str]]) -> List[str]:
        nameTimeDic = defaultdict(list)
        for name, s in access_times:
            t = int(s[:2]) * 60 + int(s[2:])
            nameTimeDic[name].append(t)

        res = []
        for name, time_lis in nameTimeDic.items():
            time_lis.sort()
            if any(time_lis[i] - time_lis[i-2] < 60 for i in range(2, len(time_lis))):
                res.append(name)

        return res

代码二:思路和1一样,这个参考自网友答案。

class Solution:
    def findHighAccessEmployees(self, access_times: List[List[str]]) -> List[str]:
        d, ans = defaultdict(list), []
        for p, t in access_times: d[p].append(t)
        for p, lst in d.items():
            lst.sort()
            if any(lst[i][:2] == lst[i + 2][:2] or (int(lst[i + 2][:2]) - int(lst[i][:2]) == 1 and lst[i + 2][2:] < lst[i][2:]) for i in range(len(lst) - 2)): ans.append(p)
        return ans

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

医学小达人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值