通过率 34% · 提交 1,187 · 通过 401
小慕的公司用一个字符串来记录员工的出勤情况: absent:缺勤 late:迟到 leaveearly:早退 present:正常上班 现在需要根据小慕的出勤记录,判断他本次是否能获得全勤奖。 获得全勤奖的条件如下: - 缺勤次数不超过一次 - 没有连续的迟到或早退 - 中,缺勤、迟到、早退的总次数不超过3次
这类题属于华为 OD 机考真题方向中「100分 / 滑动窗口」方向的高频题型,通常考察对「100分 / 滑动窗口」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
用户的考勤数据字符串,记录条数>=1;输入字符串长度<10000;
不存在非法输入
如:
2
present
present absent present present leaveearly present absent
根据考勤数据字符串,如果能得到考勤奖,输出"true",否则输出"false"
对于输入示例的结果应为true false
示例 1
输入示例
2 present present absent present present leaveearly present absent
输出示例
true false
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
每个人的考勤都是独立的,所以可以构建一个 `check()` 函数来判断每一个人的情况,记录某一个特定的人是否可以获得全勤奖。
`check()` 函数的构建包含如下步骤:
1. 判断是否存在 1 天以上的缺勤 2. 判断任意连续的 2 天,是否均为 迟到/早退 3. 判断任意连续的 7 天,是否存在 3 天以上的迟到/早退/缺勤
这三个只要有一个条件成立,直接返回 False,否则返回 True。
整体而言,题目难度并不高,只是需要对每一个条件进行较为细致的分类讨论和处理。
另外要注意取哈希表的 key 的时候,字符串单词一定不要拼错。
缺勤天数的判断非常好做,用哈希表计数器 `Counter()` 即可完成。
仅需遍历整个 lst 数组,考虑连续的两个元素 lst[i] 和 lst[i+1],查看是否均为早退/迟到即可。
这是这道题里面稍微有点难度的地方,显然我们需要考虑所有的长度为 7 的连续区间,统计其中早退/迟到/缺席的天数的和是否超过 3。
很容易想到应该使用 固定滑窗 来实现。
构建一个新的哈希表 cnt_win,来表示窗口中各个元素出现的次数。
在滑窗过程中,仅需判断 cnt_win["leaveearly"] + cnt_win["late"] + cnt_win["absent"] 是否大于 3 即可。如果是,则可以直接返回 "false"。
如果嫌判断 cnt_win["leaveearly"] + cnt_win["late"] + cnt_win["absent"] > 3 的写法太麻烦,还可以换一个角度来写,考虑 正常上班的天数是否小于 4 天,即判断 cnt_win["present"] < 4,这样也可以大大缩短代码量。
PS:由于在 Python 的切片比较灵活,当某个人的考勤总天数不足 7 天时,cnt_win = Counter(lst[:7]) 并不会产生越界报错。
但对于使用其他语言的同学来说,是需要考虑越界的,可以将遍历的右边界从 7 改为取 7 和 n 之间的较小值,这样就不会出现越界操作。
当 n <= 7 时,也自然不会进入后续的固定滑窗过程了。
Java 代码为:
C++ 代码为:
复杂度分析 设 n 为人数,d 为某一个人考勤记录的天数(各人可以不同,先按单人分析 check 函数)。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有