一、题目描述
【华为OD机试真题】A卷-优秀学员统计(JAVA)
题目描述:
公司某部门软件教导团正在组织新员工每日打卡学习活动,他们开展这项学习活动已经一个月了,所以想统计下这个月优秀的打卡员工。
每个员工会对应一个id,每天的打卡记录记录当天打卡员工的id集合,一共30天。
请你实现代码帮助统计出打卡次数tp5的员工。加入打卡次数相同,将较早参与打卡的员工排在前面,如果开始参与打卡的时间还是一样,将id较小的员工排在前面。
注:不考虑并列的情况,按规则返回前5名员工的id即可,如果当月打卡的员工少于5人,按规则排序返回所有有打卡记录的员工id.
二、输入输出
输入描述:
第一行输入为新员工数量N,表示新员工编号id为0到N-1,N的范围为[1,100]
第二行输入为30个整数,表示每天打卡的员工数量,每天至少有1名员工打卡.
之后30行为每天打卡的员工id集合,id不会重复。
输出描述:
按顺序输出打卡top5员工的id,用空格隔开。
三、参考示例
示例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
10
6 10
7 10
输出:
10 0 1 7 6
说明: 员工编号范围为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]
四、解题思路
- 读取新员工数量、每天打卡的员工数量和打卡记录。
- 创建一个映射
employeeInfo
,用于记录每位员工的打卡次数和首次打卡的索引。- 将映射信息转换为列表
employeeList
,以便排序。- 使用Lambda表达式对员工列表按照打卡次数和首次打卡index进行排序。
- 输出前5个员工的ID。
五、参考代码
/*
* @Author: mgc
* @Date: 2024-02-02 17:47:00
* @LastEditors: Do not edit
* @LastEditTime: 2024-02-02 17:48:55
*/
// import java.util.*;
// import java.util.HashMap;
// import java.util.Scanner;
// import java.util.regex.Matcher;
// import java.util.stream.Stream;
// import java.util.regex.Pattern;
// import java.util.stream.Collectors;
import java.util.Scanner;
import java.util.*;
class Main {
public static void main(String[] args) {
// 处理输入
Scanner in = new Scanner(System.in);
// 新员工数量
int numEmployees = in.nextInt();
// 每天打卡的员工数量
int[] employeeCounts = new int[30];
for (int i = 0; i < 30; i++) {
employeeCounts[i] = in.nextInt();
}
// 打卡记录
int[][] employeeIds = new int[30][];
for (int i = 0; i < 30; i++) {
employeeIds[i] = new int[employeeCounts[i]];
for (int j = 0; j < employeeCounts[i]; j++) {
employeeIds[i][j] = in.nextInt();
}
}
// 员工信息映射,key为员工ID,value为打卡记录信息:[打卡次数,首次打卡index]
HashMap<Integer, Integer[]> employeeInfo = new HashMap<>();
for (int i = 0; i < employeeIds.length; i++) {
for (int id : employeeIds[i]) {
if (employeeInfo.containsKey(id)) {
employeeInfo.get(id)[0]++;
} else {
employeeInfo.put(id, new Integer[]{1, i});
}
}
}
// 将映射信息转到列表中,以便后续排序
ArrayList<Integer[]> employeeList = new ArrayList<>();
for (Integer id : employeeInfo.keySet()) {
employeeList.add(new Integer[]{id, employeeInfo.get(id)[0], employeeInfo.get(id)[1]});
}
// 根据打卡次数和首次打卡index进行排序
employeeList.sort((a, b) ->
a[1].equals(b[1]) ? (a[2].equals(b[2]) ? a[0] - b[0] : a[2] - b[2]) : b[1] - a[1]);
// 输出前5个员工的ID
for (int i = 0; i < (employeeList.size() >= 5 ? 5 : employeeList.size()); i++) {
System.out.print(employeeList.get(i)[0] + " ");
}
}
}
六、华为OD机试真题汇总目录
【华为OD机试】真题汇总A+B+C+D券(Python实现)
标签:10,JAVA,真题,int,OD,员工,util,打卡,id From: https://blog.csdn.net/u014481728/article/details/137233544