算法解析:《考勤信息》-JS

312 阅读1分钟

题目描述

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

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

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

  • 缺勤不超过1次
  • 没有连续的迟到/早退
  • 任意连续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

解析代码

function attendanceInfo(data) {
 let result = [];
 for (const str of data) {
   const noAbsent = (str.match(/absent/g) ?? []).length < 1; // 是否有缺勤的
   // 匹配多个字符,看缺勤,迟到,早退的个数是否超过3.
   const noAgainstRule = (str.match(/(absent|leaveearly|late)/g) ?? []).length < 3; 
   // 是否有连续的迟到,早退,\x20表匹配空格, \1代表第一个括号匹配的内容
   const noContinueStr = str.match(/(leaveearly|late)(\x20)*\1/g) ?? [].length === 0; 
   result.push(noAbsent && noAgainstRule && noContinueStr);
 }
 return result.join(' ');
}

console.log(attendanceInfo(['present', 'present absent present present leaveearly leaveearly present absent late late']));