目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、解题思路
- 五、Java算法源码
- 六、效果展示
- 1、输入输出
- 2、说明
华为OD机试 2023B卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
公司用一个字符串来表示员工的出勤信息:
- absent:缺勤
- late:迟到
- leaveearly:早退
- present:正常上班
现需根据员工出勤信息,判断本次是否能获得出勤奖,能获得出勤奖的条件如下:
- 缺勤不超过一次;
- 没有连续的迟到/早退;
- 任意连续7次考勤,缺勤/迟到/早退不超过3次。
二、输入描述
第一行输入一个正整数,表示考勤记录n条;
接下来的n条输入考勤记录;
用户的考勤数据字符串:
- 记录条数 >= 1;
- 输入字符串长度 < 10000;
- 不存在非法输入;
三、输出描述
根据考勤数据字符串,如果能得到考勤奖,输出”true”;否则输出”false”。
对于输入示例的结果应为:
true false
四、解题思路
题意很简单,按照题意解答即可。
核心思想:
- 缺勤不超过一次;
- 没有连续的迟到/早退;
- 任意连续7次考勤,缺勤/迟到/早退不超过3次。
五、Java算法源码
package com.guor.od;
import java.util.*;
/**
* 考勤要求:
* 1、缺勤不超过一次 absent <= 1
* 2、没有连续的迟到/早退 没有连续的late、leaveearly
* 3、任意连续7次考勤,缺勤/迟到/早退不超过3次 absent、late、leaveearly不超过3次
*/
public class OdTest02 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 记录条数
int n = Integer.parseInt(sc.nextLine());
// 加下来的n条,输入考勤打卡记录
for (int i = 0; i < n; i++) {
System.out.println(judgeClockingIn(sc.nextLine()));
}
}
private static boolean judgeClockingIn(String input){
String arr[] = input.split(" ");
// 缺勤不超过一次
int absentCount = 0;
for (String str : arr) {
if (str.equals("absent")) {
absentCount++;
if (absentCount > 1) {
break;
}
}
}
if (absentCount > 1) {
return false;
}
// 没有连续的迟到/早退
List<String> list = new ArrayList<String>();
list.add("late");
list.add("leaveearly");
boolean flag = false;
for (int j = 1; j < arr.length; j++) {
if (list.contains(arr[j]) && list.contains(arr[j - 1])) {
// 出现连续的迟到/早退
return false;
}
}
// 3、任意连续7次考勤,缺勤/迟到/早退不超过3次 absent、late、leaveearly不超过3次
// 双指针,每7次打卡进行一次判断
int left = 0;
int right = arr.length;
if(arr.length >= 7){
right = 6;
}
// 缺勤/迟到/早退次数
int count = 0;
list.add("absent");
// 判断连个指针之间的初始值内是否已经满足false情况
for (int i = left; i < right; i++) {
if (list.contains(arr[i])) {
count++;
}
}
if (count > 3) {
return false;
}
while (right < arr.length - 1) {
/**
* 此时count表示0-6之间打卡记录的缺勤/迟到/早退次数
* 当右指针right+1时,左指针+1
* 如果左指针的打卡记录是异常记录,也应该减掉
*/
// 右指针+1
right++;
if (list.contains(arr[right])) {
count++;
}
if (list.contains(arr[left])) {
count--;
}
// 左指针+1
left++;
if (count > 3) {
break;
}
}
if (count > 3) {
return false;
}
return true;
}
}
六、效果展示
1、输入输出
6
present present absent absent
false
present leaveearly present late
true
present present late late
false
present present leaveearly late
false
present absent present late present present present leaveearly present
true
present absent present absent present leaveearly present leaveearly present
false
2、说明
🏆下一篇:华为OD机试真题 Java 实现【简易内存池】【2023 B卷 200分 考生抽中题】
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。