华为OD机试 Python【考勤信息】

题目

公司用一个字符串来表示员工的出勤信息

  • absent:缺勤
  • ate:迟到
  • eaveearly:早退
  • present:正常上班

现需根据员工出勤信息,判断本次是否能获得出勤奖,能获得出勤奖的条件如下:
1、缺勤不超过一次;
2、没有连续的迟到/早退;
3、任意连续7次考勤,缺勤/迟到/早退不超过3次。

输入描述
用户的考勤数据字符串

  • 记录条数 >= 1;
  • 输入字符串长度 < 10000;
  • 不存在非法输入;

如:

2
present
present absent present present leaveearly present absent

输出描述
根据考勤数据字符串,如果能得到考勤奖,输出”true”;否则输出”false”,
对于输入示例的结果应为:

true false

解题思路

将员工的考勤数据字符串拆分为单个记录,然后依次检查每个记录。首先统计缺勤次数,如果超过一次则直接返回 false。接着检查是否有连续的迟到或早退,如果存在则返回 false。同时,滑动窗口检查每个连续的7天考勤记录,如果缺勤、迟到或早退的次数超过3次,则返回 false。最终,如果所有条件都满足,则返回 true,表示可以获得出勤奖。最后将所有判断结果用空格分割输出。

代码

def can_get_attendance_reward(attendance_data):
    records = attendance_data.split()
    absent_count = 0

    for i in range(len(records)):
        if records[i] == "absent":
            absent_count += 1
            if absent_count > 1:
                return False

        if i > 0 and (records[i] == "late" or records[i] == "leaveearly") and (records[i - 1] == "late" or records[i - 1] == "leaveearly"):
            return False

        if i >= 6:
            count = 0
            for j in range(i - 6, i + 1):
                if records[j] in ["absent", "late", "leaveearly"]:
                    count += 1
            if count > 3:
                return False

    return True

if __name__ == "__main__":
    n = int(input().strip())
    results = []

    for _ in range(n):
        attendance_data = input().strip()
        results.append(str(can_get_attendance_reward(attendance_data)).lower())

    print(" ".join(results))


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

codereasy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值