大家好,我是晴天学长,今天的周赛第二题,需要的小伙伴可以关注支持一下哦!后续会继续更新的。💪💪💪
1) .高级访客
给你一个长度为 n 、下标从 0 开始的二维字符串数组 access_times 。对于每个 i(0 <= 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) .算法思路
假设是高级员工,排序,从第一个时间上开始+一个小时,如果有两个以上,就是高级员工
3) .算法步骤
1.创建一个空的HashSet(用于存储高访问员工的姓名)和一个空的LinkedList(用于存储最终结果)。
2.创建一个HashMap(名为map),用于将员工的姓名与其访问时间列表关联起来。
3.遍历access_times列表,对于每个访问记录,将员工的姓名作为键,将访问时间添加到其对应的值列表中。
4.开始计算高访问员工:
(1)对于map中的每个键(员工姓名):
(2)获取该员工的访问时间列表。
(3)如果访问时间列表长度小于2,则跳过该员工。
(4)将访问时间列表中的时间值转换为整数,并进行升序排序。
(5)遍历访问时间列表的前三个时间值:
(6)如果当前时间值的后两个时间值小于当前时间值加100,则将该员工的姓名添加到HashSet中。
5.将HashSet中的姓名转换为LinkedList,并返回作为结果。
4).代码示例
class Solution {public List<String> findHighAccessEmployees(List<List<String>> access_times) {Set<String> set = new HashSet<>();List<String> list = new LinkedList<>();HashMap<String, List<String>> map = new HashMap<>();// 接受数据for (int i = 0; i < access_times.size(); i++) {List<String> temp = access_times.get(i);if (!map.containsKey(temp.get(0))) {map.put(temp.get(0), new ArrayList<>());}String temp1 = temp.get(1);map.get(temp.get(0)).add(temp1);}//开始计算for (String key : map.keySet()) {//一个员工的访问记录取出来了List<String> keys = map.get(key);int[] values = new int[keys.size()];//少于两个,直径跳过if (keys.size() < 2) continue;for (int i = 0; i < keys.size(); i++) {values[i] = Integer.parseInt(keys.get(i));}Arrays.sort(values);//遍历到访问记录的前三条for (int i = 0; i < values.length - 2; i++) {if (values[i + 2] < values[i] + 100) {set.add(key);}}}//转换成答案for (String key : set) {list.add(key);}return list;}}
5).总结
- 细节问题要注意。
试题链接: