如何在华为OD机试中获得满分?Java实现【优秀学员统计】一文详解!

news/2025/2/28 7:13:35/

请添加图片描述

✅创作者:陈书予
🎉个人主页:陈书予的个人主页
🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区
🌟专栏地址: Java华为OD机试真题(2022&2023)

文章目录

  • 1. 题目描述
    • 2. 输入描述
    • 3. 输出描述
    • 4. Java算法源码
    • 5. 测试
    • 6.解题思路

1. 题目描述

公司某部门软件教导团正在组织新员工每日打卡学习活动,他们开展这项学习活动已经一个月了,所以想统计下这个月优秀的打卡员工。每个员工会对应一个id,每天的打卡记录记录当天打卡员工的id集合,一共30天。

请你实现代码帮助统计出打卡次数top5的员工。假如打卡次数相同,将较早参与打卡的员工排在前面,如果开始参与打卡的时间还是一样,将id较小的员工排在前面。

注:不考虑并列的情况,按规则返回前5名员工的id即可,如果当月打卡的员工少于5个,按规则排序返回所有有打卡记录的员工id。

2. 输入描述

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

3. 输出描述

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

补充:同一天打卡的员工没有时间上早晚的区别。不保证所有员工都会打卡。排名只针对有打卡记录的员工。

4. Java算法源码

public static void main(String[] args) {Scanner sc = new Scanner(System.in);// 新员工数量Nint N = Integer.valueOf(sc.nextLine());// 每天打卡的员工数量int[] clockArr = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();Map<Integer, int[]> map = new HashMap<>();// 之后30行为每天打卡的员工id集合,id不会重复;for (int i = 0; i < 30; i++) {for (int j = 0; j < clockArr[i]; j++) {int input = sc.nextInt();if (input > N - 1) {continue;}int[] temp = new int[2];if (map.containsKey(input)) {temp = map.get(input);++temp[1];} else {temp[0] = i;temp[1] = 1;}map.put(input, temp);}}List<Map.Entry<Integer, int[]>> mapList = new ArrayList<>(map.entrySet());mapList.sort((a, b) -> {// 按打卡次数排序if (b.getValue()[1] < a.getValue()[1]) {return -1;} else if (b.getValue()[1] == a.getValue()[1]) {// 天数相同的第一次打卡时间靠前if (b.getValue()[0] > a.getValue()[0]) {return -1;}}return 1;});StringBuilder builder = new StringBuilder();// //小于5的取所有,大于5的只取5for (int i = 0; i < (Math.min(mapList.size(), 5)); i++) {builder.append(mapList.get(i).getKey()).append(" ");}System.out.println(builder.substring(0, builder.length() - 1));
}

5. 测试

在这里插入图片描述

6.解题思路

为了解决这个问题,我们可以按照以下步骤进行操作:

  1. 读取新员工数量N。
  2. 读取30个整数,表示每天的打卡员工数量。
  3. 创建一个HashMap,用于存储员工的打卡信息。键为员工ID,值为一个长度为2的整数数组,数组的第一个元素表示员工第一次打卡的日期,第二个元素表示员工的打卡次数。
  4. 遍历每天的打卡信息:
    • 对于每天的打卡信息,读取员工的ID集合。
    • 遍历员工的ID集合,更新HashMap中对应员工的打卡信息。如果员工已存在于HashMap中,则更新其打卡次数;否则,在HashMap中添加员工的打卡信息,包括第一次打卡的日期和打卡次数。
  5. 将HashMap中的打卡信息转换为List,并根据打卡次数和第一次打卡日期进行排序。
  6. 按照题目要求,输出前5名员工的ID。

该算法的时间复杂度为O(N),其中N是新员工的数量。因为我们需要遍历30天的打卡信息,并更新HashMap中的员工打卡信息。排序的时间复杂度为O(NlogN),取决于HashMap转换为ListList的排序操作。最终的空间复杂度为O(N),取决于HashMap和List的存储空间。

以下是解题思路的Mermaid思维导图:
在这里插入图片描述

在这里插入图片描述


http://www.ppmy.cn/news/86319.html

相关文章

App 软件开发《单选1》试卷

注&#xff1a;本文章所有答案及解析均来自 ChatGPT 的回答&#xff0c;正确性请自行甄辨。 《单选1》试卷 单选题&#xff08;共计0分&#xff09; 1&#xff0e;angular ui-router中的关键词不包括&#xff08;B&#xff09; A、状态&#xff08;state&#xff09;B、HTML…

【swing】SplitPanel

当使用Java的Swing库来实现一个左右风格的SplitPanel时&#xff0c;可以使用JSplitPane作为容器&#xff0c;并在左边的面板中放置三个按钮&#xff0c;以及在右边的面板中显示图片。以下是一个示例代码&#xff1a; import javax.swing.*; import java.awt.*; import java.aw…

Altium Designer18基础

原理图 第5课 元件库介绍及电阻容模型的创建.mp4_哔哩哔哩_bilibili 原理图库&#xff08;schLib&#xff09; 1. 创建原理图库&#xff1a; panels -> SCHLIB&#xff1a;左侧弹出SCH Lib窗口 Add&#xff1a;新建原理图库 点击原理图库名称&#xff1a;进入原理图库设置…

ubuntu server 18.04 安装zmq

安装依赖 sudo apt-get install libtool pkg-config build-essential autoconf automake 编译安装ZMQ使用的加密库 sudo wget https://download.libsodium.org/libsodium/releases/LATEST.tar.gz sudo tar -zxvf LATEST.tar.gz cd libsodium-stable ./configure make make c…

C++ 11 lock_guard 和 unique_lock

文章目录 前言一、简介1.1 lock_guard1.2 RAII1.3 原理 二、unique_lock2.1 简介2.2 使用2.3 原理 三、 lock_guard 和 unique_lock比较3.1 锁的管理方式3.2 灵活性3.3 可移动性 总结 前言 最近在写C程序&#xff0c;需要用到 lock_guard &#xff0c;并记录 C11新特性 lock_g…

极米科技发布新一代光源技术,投影行业要变天?

作者&#xff1a;坚白 2018年以来&#xff0c;在年轻人群的追捧下&#xff0c;此前主要应用于商用场景的投影仪&#xff0c;逐渐切换到家用场景&#xff0c;而且随着投影技术的持续改进&#xff0c;投影效果也不断提升&#xff0c;家用投影市场进入高速发展期。 但进入2022年…

如何在华为OD机试中获得满分?Java实现【数字颠倒】一文详解!

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: Java华为OD机试真题&#xff08;2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述…

c++小游戏——谷歌小恐龙

请用Dev-cpp6.5或专业C程序&#xff0c;否则不可运行。 #include <iostream> #include <conio.h> #include <ctime> #include <chrono> #include <thread> #include <Windows.h> using namespace std; // 游戏画面宽度和高度 const int…