考勤信息
前言
本人最近再练习算法,所以会发布一些解题思路,希望大家多指教
一、题目描述
公司用一个字符串来表示员工的出勤信息:
- absent:缺勤
- late:迟到
- leaveearly:早退
- present:正常上班
现需根据员工出勤信息,判断本次是否能获得出勤奖,能获得出勤奖的条件如下:
- 缺勤不超过一次;
- 没有连续的迟到/早退;
- 任意连续7次考勤,缺勤/迟到/早退不超过3次。
二、输入描述
第一行输入一个正整数,表示考勤记录n条;
接下来的n条输入考勤记录;
用户的考勤数据字符串:
- 记录条数 >= 1;
- 输入字符串长度 < 10000;
- 不存在非法输入;
三、输出描述
根据考勤数据字符串,如果能得到考勤奖,输出”true”;否则输出”false”。
四、java代码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.nextLine());
for (int i = 0; i < n; i++) {
List<String> records = Arrays.stream(sc.nextLine().split(" ")).collect(Collectors.toList());
System.out.println(allRecord(records));
}
}
private static boolean allRecord(List records){
int n = records.size();
//初始化缺勤的次数
int abs = 0;
for (int i=0; i < n; i++) {
//缺勤不超过一次;
if("absent".equals(records.get(i))){
abs++;
if(abs > 1){
return false;
}
}
//没有连续的迟到/早退;
if((i+1)< n && ((("late".equals(records.get(i))) || ("leaveearly".equals(records.get(i)))) &&
(("late".equals(records.get(i+1))) || ("leaveearly".equals(records.get(i+1)))))) {
return false;
}
//任意连续7次考勤,缺勤/迟到/早退不超过3次。
if(n >= 7 && i+7 <= n){
//从第一条开始,依次获取连续的7次考勤数据
int time = 0;
for (int j = i; j < i + 7; j++) {
//统计缺勤/迟到/早退次数
if(("late".equals(records.get(j)))|| ("leaveearly".equals(records.get(j)))
|| ("absent".equals(records.get(j)))){
time++;
}
}
if(time > 3){
return false;
}
}
}
return true;
}
五、测试用例
输入:
3
present present absent absent
false
present present leaveearly late
false
present absent present late present present present leaveearly present
true