华为od机试真题:考勤信息(Python)

华为od机试

题目描述

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

  • 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

题解

这道题属于字符串处理和滑动窗口的算法题。题目的解题思路可以分为以下几步:

  1. 解析出每名员工的出勤记录。
  2. 遍历出勤记录,统计缺勤次数,检查是否有连续的迟到或早退,并在任意连续的7次考勤中统计缺勤、迟到和早退的次数。
  3. 根据以上统计信息,判断该员工是否符合获得出勤奖的条件。

解题思路

  1. 初始化缺勤次数 absent_cnt 和连续7天内正常上班次数 week_present_cnt
  2. 遍历每个员工的出勤记录,更新缺勤次数和连续7天内的考勤记录。
  3. 在遍历过程中,检查是否有连续的迟到或早退,并在滑动窗口中判断任意连续7天内缺勤、迟到、早退次数是否超过3次。
  4. 最终根据统计结果判断该员工是否符合获得出勤奖的条件。

Python


mp = {"absent": 0, "late": 1, "leaveearly": 1, "present": 2}


def solve(st):
    n = len(st)
    absent_cnt = 0  # 缺勤次数
    week_present_cnt = 0  # 连续7天正常上班次数

    for i in range(n):
        # 缺勤超过1次
        if st[i] == "absent" and (absent_cnt := absent_cnt + 1) > 1:
            return False
        elif st[i] == "present":
            week_present_cnt += 1

        # 连续的迟到/早退
        elif i > 0 and mp[st[i - 1]] == mp[st[i]] == 1:
            return False

        if i >= 7 and st[i - 7] == "present":
            week_present_cnt -= 1

        # 缺勒/迟到/早退超过3次
        if min(i + 1, 7) - week_present_cnt > 3:
            return False

    return True


if __name__ == "__main__":
    n = int(input())

    for _ in range(n):
        st = input().split(" ")
        print("true" if solve(st) else "false", end=' ')

2024华为OD机试(C卷+D卷)最新题库【超值优惠】Java/Python/C++合集

整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

#面经##华为od##华为od题库##秋招##校招#
全部评论
@在巴厘岛游泳的小苹果
点赞 回复 分享
发布于 2024-07-30 18:32 广东

相关推荐

LZHR:老哥你从投递简历测评完到一面中间隔了多久呀,我这边已经过了五天了仍显示简历筛选中是不是就是挂了
腾讯求职进展汇总
点赞 评论 收藏
分享
评论
5
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务