算法思路
![Screen Shot 2019-03-17 at 12.33.49 PM](/Users/s1mple/Desktop/Screen Shot 2019-03-17 at 12.33.49 PM.png)
计算 9 段和最大所需员工总人数,此人数必定满足上一休二且早中晚均衡的规则,生成该大小的 staff_list (LinkedList);
每天抽象成早、中、晚 3 个容器;staff_list 中从头开始遍历,如果当前 staff 满足早中晚均衡条件,则将该 staff 加入容器,并将该 staff 从链表中取出放到队尾;
Staff 维护一个早中晚阶段的标志(periodFlags,Period 的 Set)。每次任命前判断该员工的 periodFlags 是否包含了当前时段。如果包含,则不满足早中晚均衡,跳过该员工迭代下一个。如果不包含,则任命该员工,并在 periodFlag 中加入当前时段。如果 periodFlags 大小等于 3(即包含了早、中、晚三个时段),则将 periodFlags 清空。
建模
DailyPlan & Container
每日计划类,包含日期 date,以及抽象的早中晚 Container 内部类。
Container 类包含:
period,早中晚阶段的枚举类
number,该阶段需要的员工人数,如第2日早上需要5人
assignedStaffs,已经任命的员工集合
主要的任命逻辑在 assign(staffs) 方法中,步骤如下:
从 staffs 该 LinkedList 中从头遍历