华为机试题:出勤奖的判断

题目描述:

  • 公司用一个字符串来标识员工的出勤信息。

    • absent: 缺勤

    • late: 迟到

      • leaveearly:早退
      • present: 正常上班
  • 现需根据员工出勤信息,判断本次是否能获得出勤奖。

  • 能获得出勤奖的条件如下:

    • 缺勤不超过1次
    • 没有连续的迟到/早退
    • 任意连续7次考勤 缺勤/迟到/早退 不超过3次

输入描述:

  • 用户的考勤数据字符串记录条数 >=1,输入字符串长度 <10000,不存在非法输入。

输出描述:

  • 根据考勤数据字符串,如果能得到考勤奖输出true否则输出false。

示例:

输入:

  • 2
  • present
  • present present

输出:

  • true true

输入:

  • 2
  • present present
  • absent present late present present present present leaveearly late present present

输出:

  • true false

题解: 但不知道为什么,我的代码通过率只有 70%,有10%的测试用例没过。没找到原因。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;

public class Award {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while (sc.hasNext()) {
int n = Integer.valueOf(sc.nextLine());
String s = canAward(n, sc);
System.out.println(s);
}
}

public static String canAward(int n, Scanner sc) {
// 1:处理输入数据,转换成数组集合
ArrayList<List<String>> persons = new ArrayList<>();
for (int i = 0; i < n; ++i) {
String[] days = sc.nextLine().split(" ");
List<String> list = Arrays.stream(days).collect(Collectors.toList());
persons.add(list);
}

StringBuilder sb = new StringBuilder();
for (List<String> person : persons) {
// rule 1: 缺勤超过1次的次数统计
long absent = person.stream()
.filter(x -> x.equals("absent")).count();
if (absent > 1) {
sb.append("false").append(" ");
continue;
}

// rule 2: 没有连续的迟到/早退
boolean flag = true;
for (int i = 0; i < person.size() - 1; ++i) { // 遍历到倒数第二项即可
String cur = person.get(i); // 当天的考勤
String next = person.get(i + 1); // 第二天的考勤
if (("late".equals(cur) || "leaveearly".equals(cur))
&& ("late".equals(next) || "leaveearly".equals(next))) {
flag = false;
break;
}
}

if (!flag) {
sb.append(flag).append(" ");
continue;
}

// rule 3: 任个意连续7天考勤 缺勤/迟到/早退 不能超过3次
for (int i = 0; i < person.size() - 7; ++i) { // 遍历到倒数第7项即可
List<String> days = new ArrayList<>(); // 连续7天的考勤记录
for (int j = 0; j < 7; ++j) {
String day = person.get(i + j);
days.add(day);
}
// 分别统计缺勤/迟到/早退的次数
long absentCount = days.stream().filter(x -> x.equals("absent")).count();
long lateCount = days.stream().filter(x -> x.equals("late")).count();
long leaveEarlyCount = days.stream().filter(x -> x.equals("leaveearly")).count();
long count = absentCount + lateCount + leaveEarlyCount;
if (count > 3) {
flag = false;
break;
}
}

if (!flag) {
sb.append(flag).append(" ");
continue;
} else {
// 能拿出勤奖的人
sb.append(flag).append(" ");
}
}

return sb.toString();
}

}
你的赞赏将是我创作输出的最大动力
0%