【华为OD机试 2023 Q1考试题 A卷】top前5的优秀学员统计

题目

        公司某部门正在组织新员工每日打卡学习活动,他们开展这项学习活动已经一个月了,现在想统计下这个月优秀的打卡员工。

每个员工会对应一个 id,

每天的打卡记录记录当天打卡员工的 id 集合,一共 30 天。


        请你通过代码帮助统计出打卡次数 top5 的员工:

1、假如打卡次数相同,将较早参与打卡的员工排在前面,

2、如果开始参与打卡的时间还是一样,将 id 较小的员工排在前面。
3、不考虑并列的情况,按规则返回前 5 名员工的 id 即可,

4、如果当月打卡的员工少于 5 个,按规则排序返回所有有打卡记录的员工 id。

        输入 

1、第一行输入为新员工数量 N,表示新员工编号 id 为 0 到 N-1,N 的范围为 [1,100]
2、第二行输入为 30 个整数,表示每天打卡的员工数量,每天至少有 1 名员工打卡
3、之后 30 行为每天打卡的员工 id 集合,id 不会重复

        输出 

按顺序输出打卡 top5 员工的 id,用空格隔开

备注
同一天打卡的员工没有时间上早晚的区别。

不保证所有员工都会打卡。

排名只针对有打卡记录的员工。

        示例一 

输入
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


输出
10 0 1 7 6
1
说明
员工编号范围为 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]   

实现代码如下
# Time:2023 2023/6/26 9:48
# Author: Jasmay
# -*- coding: utf-8 -*-


from collections import defaultdict

def solve_method(res,n):
    dic = defaultdict(int)
    dic_index = {}
    for i,r in enumerate(res):
        for s in r:
            dic[s] += 1
            if s not in dic_index:
                dic_index[s] = i
        result = []
    for k,v in dic_index.items():
        result.append([k,dic.get(k),v])

    #排序
    result = sorted(result,key=lambda x:(-x[1],x[2],x[0]))
    h = []
    for i in result:
        h.append(i[0])
    return h[:5]

if __name__ == "__main__":
    n = int(input().strip())
    nums = list(map(int,input().split()))
    res = []
    for _ in range(len(nums)):
        res.append(list(map(int,input().split())))
    print(*solve_method(res,n))

猜你喜欢

转载自blog.csdn.net/Moonlight_16/article/details/131390747