当前位置: 首页 > news >正文

(100分)- 考勤信息(Java JS Python C)

(100分)- 考勤信息(Java & JS & Python & C)

题目描述

公司用一个字符串来表示员工的出勤信息

  • absent:缺勤
  • late:迟到
  • leaveearly:早退
  • present:正常上班

现需根据员工出勤信息,判断本次是否能获得出勤奖,能获得出勤奖的条件如下:

  • 缺勤不超过一次;
  • 没有连续的迟到/早退;
  • 任意连续7次考勤,缺勤/迟到/早退不超过3次。
输入描述

用户的考勤数据字符串

  • 记录条数 >= 1;
  • 输入字符串长度 < 10000;
  • 不存在非法输入;

如:

2
present
present absent present present leaveearly present absent

输出描述

根据考勤数据字符串,如果能得到考勤奖,输出”true”;否则输出”false”,
对于输入示例的结果应为:

true false

用例
输入2
present
present present
输出true
true
说明
输入2
present
present absent present present leaveearly present absent
输出true
false
说明
题目解析

需要注意以下几点:

  1. 关于"连续的迟到/早退"定义:

    • 指本次和上次都是迟到或早退的情况
    • 例如:本次迟到且上次早退,也属于连续的迟到/早退
  2. 解题关键点:

    • 需要统计任意连续7次考勤记录中的缺勤/迟到/早退次数
    • 建议采用滑动窗口法进行处理
  3. 滑动窗口实现细节:

    • 窗口最大长度为7
    • 当右边界R < 7时,窗口长度 = R + 1
    • 当R ≥ 7时:
      • 窗口长度固定为7
      • 左边界L = R - 6

我们只要计算出滑窗内部 present 次数,即可通过:

滑窗长度 - present次数 = 任意连续7次考勤中的缺勤/迟到/早退次数

JavaScript算法源码
const rl = require("readline").createInterface({ input: process.stdin }); var iter = rl[Symbol.asyncIterator](); const readline = async () => (await iter.next()).value; void (async function () { const n = parseInt(await readline()); const records = []; for (let i = 0; i < n; i++) { records.push((await readline()).split(" ")); } getResult(records); })(); function getResult(records) { for (let record of records) console.log(isAward(record)); } function isAward(record) { // 总缺勤次数 let absent = 0; // 滑窗内正常上班的次数 let present = 0; // 记录前一次的考勤记录 let preRecord = ""; for (let i = 0; i < record.length; i++) { // 滑窗长度最大为7,如果超过7,则滑窗的左边界需要右移, 滑窗失去的部分record[i - 7] // 如果失去部分是present,则更新滑窗内present次数 if (i >= 7) { if ("present" == record[i - 7]) present--; } // 当前的考勤记录 const curRecord = record[i]; switch (curRecord) { case "absent": // 缺勤不超过一次 if (++absent > 1) return false; break; case "late": case "leaveearly": // 没有连续的迟到/早退 if ("late" == preRecord || "leaveearly" == preRecord) return false; break; case "present": present++; break; } preRecord = curRecord; // 任意连续7次考勤,缺勤/迟到/早退不超过3次, 相当于判断: 滑窗长度 - present次数 <= 3 const window_len = Math.min(i + 1, 7); if (window_len - present > 3) return false; } return true; }
Java算法源码
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = Integer.parseInt(sc.nextLine()); String[][] records = new String[n][]; for (int i = 0; i < n; i++) { records[i] = sc.nextLine().split(" "); } getResult(n, records); } public static void getResult(int n, String[][] records) { for (int i = 0; i < n; i++) { System.out.println(isAward(records[i])); } } public static boolean isAward(String[] record) { // 总缺勤次数 int absent = 0; // 滑窗内正常上班的次数 int present = 0; // 记录前一次的考勤记录 String preRecord = ""; for (int i = 0; i < record.length; i++) { if (i >= 7) { // 滑窗长度最大为7,如果超过7,则滑窗的左边界需要右移, 滑窗失去的部分record[i - 7] // 如果失去部分是present,则更新滑窗内present次数 if ("present".equals(record[i - 7])) present--; } // 当前的考勤记录 String curRecord = record[i]; switch (curRecord) { case "absent": // 缺勤不超过一次 if (++absent > 1) return false; break; case "late": case "leaveearly": // 没有连续的迟到/早退 if ("late".equals(preRecord) || "leaveearly".equals(preRecord)) return false; break; case "present": present++; break; } preRecord = curRecord; // 任意连续7次考勤,缺勤/迟到/早退不超过3次, 相当于判断: 滑窗长度 - present次数 <= 3 int window_len = Math.min(i + 1, 7); // 滑窗长度 if (window_len - present > 3) return false; } return true; } }
Python算法源码
# 输入获取 n = int(input()) records = [input().split() for _ in range(n)] def isAward(record): # 总缺勤次数 absent = 0 # 滑窗内正常上班的次数 present = 0 late_leaveearly = ("late", "leaveearly") # 前一次的考勤记录 preRecord = "" for i in range(len(record)): # 滑窗长度最大为7,如果超过7,则滑窗的左边界需要右移, 滑窗失去的部分record[i - 7] # 如果失去部分是present,则更新滑窗内present次数 if i >= 7: if "present" == record[i-7]: present -= 1 # 当前的考勤记录 curRecord = record[i] if "absent" == curRecord: absent += 1 # 缺勤超过1次,则拿不到全勤奖 if absent > 1: return "false" elif curRecord in late_leaveearly and preRecord in late_leaveearly: # 连续的迟到/早退,则拿不到全勤奖 return "false" elif "present" == curRecord: present += 1 preRecord = curRecord # 任意连续7次考勤,缺勤/迟到/早退不超过3次, 相当于判断: 滑窗长度 - present次数 <= 3 window_len = min(i+1, 7) # 滑窗长度 if window_len - present > 3: return "false" return "true" # 算法入口 def getResult(): for record in records: print(isAward(record)) # 算法调用 getResult()
C算法源码
#include <stdio.h> #include <string.h> #define MIN(a, b) ((a) < (b) ? (a) : (b)) int isAward(char records[][15], int records_size); int eq(char *a, char *b); int main() { int n; scanf("%d", &n); for (int i = 0; i < n; i++) { char records[10000][15]; int records_size = 0; while(scanf("%s", records[records_size++])) { if(getchar() != ' ') break; } puts(isAward(records, records_size) ? "true" : "false"); } return 0; } int isAward(char records[][15], int records_size) { // 总缺勤次数 int absent = 0; // 滑窗内正常上班的次数 int present = 0; // 记录前一次的考勤记录 char *preRecord = ""; for (int i = 0; i < records_size; i++) { // 滑窗长度最大为7,如果超过7,则滑窗的左边界需要右移, 滑窗失去的部分record[i - 7] // 如果失去部分是present,则更新滑窗内present次数 if (i >= 7) { if(eq("present", records[i-7])) { present--; } } // 当前的考勤记录 char *curRecord = records[i]; if (eq(curRecord, "absent")) { // 缺勤不超过一次 if (++absent > 1) return 0; } else if (eq(curRecord, "late") || eq(curRecord, "leaveearly")) { // 没有连续的迟到/早退 if (eq(preRecord, "late") || eq(preRecord, "leaveearly")) return 0; } else if (eq(curRecord, "present")) { present++; } preRecord = curRecord; // 任意连续7次考勤,缺勤/迟到/早退不超过3次, 相当于判断: 滑窗长度 - present次数 <= 3 int window_len = MIN(i + 1, 7); if (window_len - present > 3) return 0; } return 1; } int eq(char *a, char *b) { return strcmp(a, b) == 0 ? 1 : 0; }
http://www.jsqmd.com/news/433949/

相关文章:

  • 2026年比较好的大型推拉棚/定制推拉棚精选厂家推荐 - 品牌宣传支持者
  • (100分)- 密码输入检测(Java JS Python C)
  • (100分)- 密钥格式化(Java JS Python)
  • 电动夹爪哪家更靠谱?自动化产线专用夹爪品牌实测对比推荐 - 品牌2026
  • 2026年知名的推拉棚销售厂家哪家好 - 品牌宣传支持者
  • 2026年电磁夹爪供应商怎么挑?可靠供应商厂家名单与选型要点 - 品牌2026
  • 【小沐学AI】解锁Claude Code,小白也能玩转AI编程
  • 2026年知名的灯带批发/灯带定制值得信赖的生产厂家 - 品牌宣传支持者
  • 基于Java+SSM+Flask智能训练管理平台(源码+LW+调试文档+讲解等)/智能训练/管理平台/训练软件/训练系统/智能化训练/训练计划/训练效果评估/训练数据分析/训练管理解决方案
  • 基于Java+SSM+Flask儿童教育网站(源码+LW+调试文档+讲解等)/儿童教育/教育网站/儿童学习/网上教育/孩子教育/学习资源/儿童成长/教育资源/儿童乐园/在线课程
  • 小白刷力扣100(3)-最长连续序列
  • 企业级健身俱乐部网站管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • Java Web 考研互助交流平台系统源码-SpringBoot2+Vue3+MyBatis-Plus+MySQL8.0【含文档】
  • SpringBoot+Vue 疫情防控管理系统管理平台源码【适合毕设/课设/学习】Java+MySQL
  • 电动自行车违法智能识别
  • 智能安防中的行人识别技术
  • 2026年热门的智能家具用电线材实力工厂怎么选 - 品牌宣传支持者
  • 【2025最新】基于SpringBoot+Vue的科研管理系统管理系统源码+MyBatis+MySQL
  • Linux系统常用命令(其三)进程与系统监控、文件权限
  • 双臂协作机器人 LZDR750-5NLF 介绍
  • 跨国企业在中国月报 | 雀巢、资生堂、迪士尼、迪卡侬、蔡司、立邦、DHL等公司动态
  • Rust 语言开发的 Linux 桌面来了
  • Linux救援模式是什么,如何使用
  • Linux 程序地址空间深度解析:虚拟地址背后的真相
  • 【实战复盘】TryBanana2:基于 Nano Banana 2 的 4K AI 图像生成与编辑工作流
  • 2026年口碑好的手刹冲压件值得信赖的生产厂家 - 品牌宣传支持者
  • 2026年靠谱的油烟净化风机实力厂家如何选 - 品牌宣传支持者
  • 中国电缆一线品牌推荐:2026年3月中国电缆标杆品牌推荐 - 品牌2026
  • 中国电缆一线品牌推荐:石油石化、矿山煤矿、变频、光伏电缆等品牌推荐 - 品牌2026
  • 电缆生产厂家推荐名单:2026年3月电缆生产厂家推荐及相关厂家汇总 - 品牌2026