您现在的位置是:首页 >技术交流 >【华为OD机试真题 C语言】25、考勤信息 | 机试真题+思路参考+代码解析网站首页技术交流

【华为OD机试真题 C语言】25、考勤信息 | 机试真题+思路参考+代码解析

KJ.JK 2024-10-11 00:01:02
简介【华为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, "
")] = '';  // 去除字符串末尾的换行符
        
        bool valid = false;
        int length = strlen(attendance);
        
        if (length >= 7) {
            valid = !hasConsecutiveLateOrEarly(attendance, length) &&
                    hasValidAttendance(attendance, length);
        }
        
        printf("%s
", valid ? "true" : "false");
    }
    
    return 0;
}


作者:KJ.JK

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。