考勤信息 - 华为OD统一考试(C卷)
OD统一考试(C卷)
分值: 100分
题解: Java / Python / C++
题目描述
公司用一个字符串来表示员工的出勤信息
- absent:缺勒
- late: 迟到
- leaveearly: 早退
- present: 正常上班
现需根据员工出勤信息,判断本次是否能获得出勤奖,能获得出勤奖的条件如下:
- 缺勤不超过一次,
- 没有连续的迟到/早退:
- 任意连续7次考勤,缺勒/迟到/早退不超过3次
输入描述
第一行输入一个整数n
,表示有多少个员工
后面n
行,每一行输入若干个字符串,表示第i
名员工的出勤信息
输出描述
输出n
行,每一行表示这名员工能否获得出勤奖,如果可以,则输出“true",否则输出”false"
示例1
输入:
2
present
present present
输出:
true true
示例2
输入:
2
present
present absent present present leaveearly present absent
输出:
true false
题解
这是一个关于员工出勤情况的问题,主要涉及对员工出勤信息的分析和条件判断。下面是关于这个问题的一些解题思路和代码解释:
解题思路
- 使用一个HashMap(或字典)
mp
来映射字符串与整数的关系,方便后续的判断。其中,"absent"对应0,"late"和"leaveearly"对应1,"present"对应2。- 遍历员工的出勤信息,同时维护计数器来记录
缺勤次数
和连续7天正常上班次数
。- 判断缺勤次数是否超过1次,如果超过则返回false。
- 判断连续的迟到/早退,如果发现连续的迟到/早退则返回false。
- 更新连续7天正常上班次数,同时判断缺勤/迟到/早退是否超过3次。
- 如果所有条件都满足,则返回true,表示员工能够获得出勤奖。
Java
import java.util.HashMap;
import java.util.Scanner;
/**
* @author code5bug
*/
public class Main {
static HashMap<String, Integer> mp = new HashMap<>();
static {
mp.put("absent", 0);
mp.put("late", 1);
mp.put("leaveearly", 1);
mp.put("present", 2);
}
static boolean solve(String[] st) {
int n = st.length;
int absent_cnt = 0; // 缺勤次数
int week_present_cnt = 0; // 连续7天正常上班次数
for (int i = 0; i < n; i++) {
// 缺勤超过1次
if (st[i].equals("absent") && ++absent_cnt > 1)
return false;
else if (st[i].equals("present"))
week_present_cnt++;
// 连续的迟到/早退
else if (i > 0 && mp.get(st[i - 1]).equals(mp.get(st[i])) && mp.get(st[i]) == 1)
return false;
if (i >= 7 && st[i - 7].equals("present"))
week_present_cnt--;
// 缺勒/迟到/早退超过3次
if (Math.min(i + 1, 7) - week_present_cnt > 3)
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2024华为OD机试真题题解 文章被收录于专栏
华为OD机考(C卷、D卷)算法题库(绝对都是原题),帮助你上岸华为(已经不少小伙伴成功上岸)。提供Java、Python、C++ 三种语言的解法。每篇文章都有详细的解题步骤、代码注释详细及相关知识点的练习题。有问题,随时解答