2哥 : 3妹,今天周五怎么还下班这么晚啊?这么晚了才回来
3妹:项目快上线了, 最近事情比较多,再累也要干, 撸起袖子加油干!
2哥 : 辛苦辛苦, 哎,你看到王自如格力那个采访了吗?最近挺火的🔥。
3妹:看了, 不过不作评价。 学不来呀学不来
2哥 : 网上褒贬不一, 有的说是在溜须拍马, 有的说他很懂职场生存之道。
3妹:2哥,你说职场中员工和老板到底是什么关系?对立关系吗,还是说可以是朋友、师生?
2哥:都有可能,最重要的是心态要好。
3妹:有的人java好,有的人python好,而我不一样,我心态好。嘿嘿。
2哥:说到员工, 今天看到了一个关于员工的题目,我们来做一下吧~
题目:
给你一个长度为 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’ 组成。
思路:
分组+排序,
把名字相同的员工对应的访问时间(转成分钟数)分到同一组中。
对于每一组的访问时间 a,排序后,判断是否有 a[i]−a[i−2]<60,如果有,那么把这一组的员工名字加到答案中。
java代码:
class Solution {
public List<String> findHighAccessEmployees(List<List<String>> accessTimes) {
Map<String, List<Integer>> groups = new HashMap<>();
for (var entry : accessTimes) {
String name = entry.get(0), s = entry.get(1);
int t = Integer.parseInt(s.substring(0, 2)) * 60 + Integer.parseInt(s.substring(2));
groups.computeIfAbsent(name, k -> new ArrayList<>()).add(t);
}
List<String> ans = new ArrayList<>();
for (var entry : groups.entrySet()) {
List<Integer> a = entry.getValue();
Collections.sort(a);
for (int i = 2; i < a.size(); i++) {
if (a.get(i) - a.get(i - 2) < 60) {
ans.add(entry.getKey());
break;
}
}
}
return ans;
}
}