华为机考真题 -- 考勤信息

题目描述:

公司用一个字符串来表示员工的出勤信息:
absent: 缺勤
late:迟到
leaveearly: 早退
present: 正常上到

现需根据员工出勤信息,判断本次是否能获得出勤奖,能获得出勤奖的条件如下:
1. 缺勤不超过一次;
2. 没有连续的迟到早退;
3. 任意连续7次考勤,缺勤迟到/早退不超过3次;

输入描述:

第一行输入一个整数n,表示有多少个员工;
第二行输入若干个字符串,即员工考勤状态,表示第1名员工的出勤信息;
第三行输入若干个字符串,即员工考勤状态,表示第2名员工的出勤信息;
...
第N+1行输入若干个字符串,即员工考勤状态,表示第N名员工的出勤信息;

输出描述:

将每个员工的全勤状态记录在一个全勤数组中,并依次输出。该数组中的每个元素对应的每位员工能否获得出勤奖状态;如果可以,则输出“true",否则输出”false";

示例1:

输入
2
present
present present

输出
true true

示例2:

输入
2
present
present absent present present leaveearly present absent

输出
true false

C++源码:

#include <iostream>
#include <vector>
#include <string>
#include <sstream>

using namespace std;

//const int MAX_LENGTH = 2e5 + 5;  // 更改最大长度常量名称

// 重命名函数和变量
vector<string> string2workState() {
    string before;
    getline(cin, before);
    istringstream lineStream(before);
    vector<string> workState;
    string workerState;
    while (s >> workerState)
        workState.push_back(workerState);
    return workState;
}

int main() {
    int workers;
    cin >> workers;
    
    cin.ignore();  // 替换getchar()以读取并丢弃换行符

    vector<string> tempStr(workers);
    // 使用for循环替换while循环
    for (int i = 0; i < workers; ++i) {
        vector<string> worker = string2workState();
        bool forAward = true;
        int absenceCount = 0;

        // 遍历考勤记录
        for (int k = 0; k < worker.size(); ++k) {
            if (worker[k] == "leaveearly")
                worker[k] = "late";

            absenceCount += worker[k] == "absent";

            // 检查是否有连续迟到
            if (k > 0 && worker[k] == "late" && worker[k - 1] == "late")
                forAward = false;

            // 检查任意连续7次考勤中不良记录是否超过3次
            if (k >= 6) {
                int presentCount = 0;
                for (int j = 0; j < 7; ++j)
                    presentCount += worker[k - j] == "present";
                if (presentCount < 4)
                    forAward = false;
            }
        }

        // 检查缺勤次数是否超过一次
        if (absenceCount > 1)
            forAward = false;
        
        tempStr[i] = forAward;
        if (forAward) {
            tempStr[i] = "true";
        }
        else {
            tempStr[i] = "false";
        }
    }

    for (int i = 0; i < tempStr.size(); i++)
    {
        cout << tempStr[i] << " ";
    }
    cout << endl;

    system("pause");
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值