最新华为OD机试真题-员工出勤奖评定(100分)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员

✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解

👏 感谢大家的订阅➕ 和 喜欢💗

最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线评测

最新华为OD机试目录: https://www.nowcoder.com/discuss/636153620743897088?sourceSSR=users

📎在线评测链接

员工出勤奖评定(100分)

alt

🌍 评测功能需要 =>订阅专栏<= 后联系清隆解锁~

🍓OJ题目截图

alt

🫐 员工出勤奖评定

题目描述

K小姐是一家公司的人力资源经理,她需要根据员工的出勤信息来决定是否发放考勤奖励。

公司规定,每个员工的出勤信息用一个字符串表示,其中:

  • absent:缺勤
  • late:迟到
  • leaveearly:早退
  • present:正常出勤

如果某位员工能够满足以下全部条件,即可获得考勤奖励:

  1. 缺勤次数不超过 次;
  2. 没有连续的迟到或早退;
  3. 任意连续 天内,缺勤、迟到和早退的次数总和不超过 次。

输入格式

第一行包含一个正整数 ,表示员工的总数。

接下来 行,每行若干个空格分隔的字符串,分别表示一名员工的出勤记录。

输出格式

输出 行,每行为 truefalse,表示对应的员工是否能获得考勤奖励。

样例输入

2
present 
present present

样例输出

true
true

样例输入

2
present
present absent present present leaveearly present absent

样例输出

true
false

数据范围

,每个员工的出勤记录不超过 条。

题解

我们可以使用滑动窗口的思路来判断员工是否满足获得出勤奖励的条件。具体做法如下:

  1. 统计员工的总缺勤次数,如果超过 1 次,则直接不满足条件。
  2. 使用一个长度为 7 的滑动窗口,统计窗口内正常上班的次数。
  3. 判断窗口内是否存在连续的迟到/早退记录,如果存在,则不满足条件。
  4. 判断窗口内缺勤/迟到/早退的总次数是否超过 3 次,如果超过,则不满足条件。
  5. 滑动窗口,重复步骤 2-4,直到遍历完所有记录。

该方法的时间复杂度为 ,空间复杂度为 ,其中 为员工的出勤记录长度。

参考代码

  • Python
# 输入获取
emp_count = int(input())
records = [input().split() for _ in range(emp_count)]

def check_award(attendance):
    absent_days = 0
    present_days = 0
    late_early = ("late", "leaveearly")
    prev_status = ""

    for i, status in enumerate(attendance):
        # 滑动窗口长度最大为7
        if i >= 7:
            if attendance[i - 7] == "present":
                present_days -= 1

        # 处理当前状态
        if status == "absent":
            absent_days += 1
            if absent_days > 1:
                return "false"
        elif status in late_early and prev_status in late_early:
            return "false"
        elif status == "present":
            present_days += 1

        prev_status = status

        # 任意连续7天,缺勤/迟到/早退不超过3次
        window_size = min(i + 1, 7)
        if window_size - present_days > 3:
            return "false"

    return "true"

# 算法入口
def get_result():
    for record in records:
        print(check_award(record))

# 算法调用
get_result()

  • Java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int empCount = scanner.nextInt();
        scanner.nextLine(); // 消耗换行符
        String[] rec

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

最新华为OD机试-E+D卷 文章被收录于专栏

本专栏给大家提供了华为2024最新华为OD-E/D卷的题目汇总和(Java/Cpp/Python)三语言解析 + 部分题目提供OJ在线评测

全部评论

相关推荐

不入算法余生悔:大二开始实习,本科三年经验,再考个研,到研二正好是五年经验
点赞 评论 收藏
分享
1 2 评论
分享
牛客网
牛客企业服务