您现在的位置是:首页 >技术交流 >【华为OD机试真题 C语言】25、考勤信息 | 机试真题+思路参考+代码解析网站首页技术交流
【华为OD机试真题 C语言】25、考勤信息 | 机试真题+思路参考+代码解析
简介【华为OD机试真题 C语言】25、考勤信息 | 机试真题+思路参考+代码解析
?个人博客首页: 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);
while (n--) {
char attendance[100];
fgets(attendance, sizeof(attendance), stdin);
attendance[strcspn(attendance, "
")] = '