文章目录
- 一、题目
- 🎃题目描述
- 🎃输入输出
- 🎃样例1
- 🎃样例2
- 二、思路参考
- 三、代码参考
- 作者:KJ.JK
🍂个人博客首页: KJ.JK
🍂专栏介绍: 华为OD机试真题汇总,定期更新华为OD各个时间阶段的机试真题,每日定时更新,本专栏将使用C语言进行更新解答,包含真题,思路分析,代码参考,欢迎大家订阅学习
一、题目
🎃题目描述
公司用一个字符串来表示员工的出勤信息
absent:缺勤
late:迟到
leaveearly:早退
present:正常上班
现需根据员工出勤信息,判断本次是否能获得出勤奖,能获得出勤奖的条件如下:
缺勤不超过一次;
没有连续的迟到/早退;
任意连续7次考勤,缺勤/迟到/早退不超过3次
🎃输入输出
输入
用户的考勤数据字符串,记录条数 >= 1;
输入字符串长度 < 10000;
不存在非法输入
如:
2
present
present absent present present leaveearly present absent
输出
根据考勤数据字符串,如果能得到考勤奖,输出”true”;否则输出”false”,
对于输入示例的结果应为:
true false
🎃样例1
输入
2
present
present present输出
true
true
🎃样例2
输入
2
present
present absent present present leaveearly present absent输出
true
false
二、思路参考
1、首先,读取一个整数n,表示有n个考勤数据字符串。2、使用循环,迭代n次,每次读取一行考勤数据字符串。3、在每次循环中,进行以下判断:a. 检查考勤数据字符串的长度是否大于等于7,因为需要满足连续7次考勤的条件。b. 如果字符串长度小于7,无法满足连续7次考勤的条件,直接输出"false"。c. 如果字符串长度大于等于7,继续进行下一步判断。d. 调用一个函数hasConsecutiveLateOrEarly,该函数用于判断字符串中是否包含连续的迟到或早退。e. 如果存在连续的迟到或早退,直接输出"false"。f. 如果不存在连续的迟到或早退,继续进行下一步判断。g. 调用一个函数hasValidAttendance,该函数用于判断字符串中是否满足连续7次考勤,缺勤/迟到/早退不超过3次的条件。h. 如果满足条件,输出"true";否则输出"false"。4、完成循环后,结束程序。
三、代码参考
#include <stdio.h>
#include <stdbool.h>
#include <string.h>// 函数用于判断字符串中是否包含连续的迟到/早退
bool hasConsecutiveLateOrEarly(char* attendance, int length) {int count = 0;for (int i = 0; i < length; i++) {if (attendance[i] == 'l' || attendance[i] == 'e') {count++;if (count >= 2) {return true;}} else {count = 0;}}return false;
}// 函数用于判断字符串中是否满足连续7次考勤,缺勤/迟到/早退不超过3次的条件
bool hasValidAttendance(char* attendance, int length) {int count = 0;int absentCount = 0;int lateOrEarlyCount = 0;for (int i = 0; i < length; i++) {if (attendance[i] == 'a') {absentCount++;count++;} else if (attendance[i] == 'l' || attendance[i] == 'e') {lateOrEarlyCount++;count++;} else {count++;}if (count >= 7) {if (absentCount <= 3 && lateOrEarlyCount <= 3) {return true;} else {if (attendance[i - 6] == 'a') {absentCount--;} else if (attendance[i - 6] == 'l' || attendance[i - 6] == 'e') {lateOrEarlyCount--;}}}}return false;
}int main() {int n;scanf("%d\n", &n);while (n--) {char attendance[100];fgets(attendance, sizeof(attendance), stdin);attendance[strcspn(attendance, "\n")] = '\0'; // 去除字符串末尾的换行符bool valid = false;int length = strlen(attendance);if (length >= 7) {valid = !hasConsecutiveLateOrEarly(attendance, length) &&hasValidAttendance(attendance, length);}printf("%s\n", valid ? "true" : "false");}return 0;
}