目录
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、补充说明
- 五、解题思路
- 六、Python算法源码
- 七、效果展示
- 1、输入
- 2、输出
- 3、说明
一、题目描述
公司某部门软件教导团正在组织新员工每日打卡学习活动,他们开展这项学习活动已经一个月了,所以想统计下这个月优秀的打卡员工。每个员工会对应一个id,每天的打卡记录记录当天打卡员工的id集合,一共30天。
请你实现代码帮助统计出打卡次数top5的员工。假如打卡次数相同,将较早参与打卡的员工排在前面,如果开始参与打卡的时间还是一样,将id较小的员工排在前面。
注:不考虑并列的情况,按规则返回前5名员工的id即可,如果当月打卡的员工少于5个,按规则排序返回所有有打卡记录的员工id。
二、输入描述
第一行输入为新员工数量N,表示新员工编号id为0到N-1,N的范围为[1,100];
第二行输入为30个整数,表示每天打卡的员工数量,每天至少有1名员工打卡;
之后30行为每天打卡的员工id集合,id不会重复;
三、输出描述
按顺序输出打卡top5员工的id,用空格隔开。
四、补充说明
同一天打卡的员工没有时间上早晚的区别。不保证所有员工都会打卡。排名只针对有打卡记录的员工。
五、解题思路
为了解决这个问题,我们可以按照以下步骤进行操作:
- 读取新员工数量N。
- 读取30个整数,表示每天的打卡员工数量。
- 创建一个HashMap,用于存储员工的打卡信息。键为员工ID,值为一个长度为2的整数数组,数组的第一个元素表示员工第一次打卡的日期,第二个元素表示员工的打卡次数。
- 遍历每天的打卡信息:
- 对于每天的打卡信息,读取员工的ID集合。
- 遍历员工的ID集合,更新HashMap中对应员工的打卡信息。如果员工已存在于HashMap中,则更新其打卡次数;否则,在HashMap中添加员工的打卡信息,包括第一次打卡的日期和打卡次数。
- 将HashMap中的打卡信息转换为List,并根据打卡次数和第一次打卡日期进行排序。
- 按照题目要求,输出前5名员工的ID。
该算法的时间复杂度为O(N)
,其中N是新员工的数量。因为我们需要遍历30天的打卡信息,并更新HashMap
中的员工打卡信息。排序的时间复杂度为O(NlogN)
,取决于HashMap
转换为List
和List
的排序操作。最终的空间复杂度为O(N)
,取决于HashMap和List的存储空间。
六、Python算法源码
import sys
import collections
# handle inputs
n = int(sys.stdin.readline().strip())
calendar = sys.stdin.readline().strip("\n").split()
res_map = collections.OrderedDict()
day = 30
for i in range(day):
current = sys.stdin.readline().strip("\n").split()
for id in current:
res_map.setdefault(id, 0)
res_map[id] += 1
count_list = sorted(res_map.items(), key=lambda x: x[1], reverse=True)
length = 5
if n <= 5:
length = n
for i in range(length):
print(count_list[i][0], end=" ")
七、效果展示
1、输入
11
4 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2
0 1 7 10
0 1 6 10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
10
6 10
7 10
2、输出
10 0 1 7 6
3、说明
员工编号范围为0-10,id为10的员工连续打卡30天,排第一,id为0,1,6,7的员工打卡都是两天,id为0,1,7的员工在第一天就打卡,比id为6的员工早,排在前面,0,1,7按id升序排序,所以输出[10,0,1,7,6]。
🏆下一篇:华为OD机试真题 Python 实现【相对开音节】【2022Q4 100分】,附详细解题思路
🏆本文收录于,华为OD机试(Python)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,发现新题目,随时更新,全天CSDN在线答疑。