根据以下已知条件写出计算请假天数的最优算法 1、年度日历数据表结构如下,可直接获取日期类型 1:工作日 2:法定假日 3:周末假日 2、每日工作时间设定数据如下 上午上班时间:08:30 上午下班时间:12:30 下午上班:13:30 下午下班时间:17:30 3、问题:根据输入的开始结束时间,计算请假天数 例阳:2022-09-3013:30:00至2022-10-1517:30:00 用java实现
时间: 2023-06-04 10:07:34 浏览: 173
《数据结构与算法》期末练习题(含答案).pdf
请假天数的最优算法可以如下实现:
1. 首先,解析输入的开始结束时间,获得请假的起始日期和结束日期。
2. 然后,使用一个循环遍历起始日期和结束日期之间的每一天,并逐一判断该天是否为工作日。
3. 判断方法如下:先检查该天是否为法定假日或周末假日,如果是则跳过;否则,判断该天是否在工作时间内,如果不在则跳过,否则计入请假天数。
4. 最终,返回请假天数即可。
伪代码如下:
// 解析输入的开始结束时间
Date startDate = parseStartDate();
Date endDate = parseEndDate();
// 计算请假天数
int leaveDays = 0;
Calendar calendar = Calendar.getInstance();
calendar.setTime(startDate);
while (calendar.getTime().compareTo(endDate) <= 0) {
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
boolean isWeekend = (dayOfWeek == Calendar.SATURDAY) || (dayOfWeek == Calendar.SUNDAY);
if ((!isWeekend) && (!isHoliday(calendar)) && (isWorkingTime(calendar))) {
leaveDays++;
}
calendar.add(Calendar.DAY_OF_MONTH, 1);
}
// 返回请假天数
return leaveDays;
// 判断某一天是否为法定假日或周末假日
private boolean isHoliday(Calendar calendar) {
// 查询该日期是否为法定假日,如果是返回true
// 查询该日期是否为周末补班日,如果是返回false,否则返回true
}
// 判断某一天是否在工作时间内
private boolean isWorkingTime(Calendar calendar) {
int hour = calendar.get(Calendar.HOUR_OF_DAY);
int minute = calendar.get(Calendar.MINUTE);
if ((hour < 8) || (hour >= 18)) {
return false;
}
if ((hour == 8) && (minute < 30)) {
return false;
}
if ((hour == 12) && (minute >= 30)) {
return false;
}
if ((hour == 13) && (minute < 30)) {
return false;
}
if ((hour == 17) && (minute >= 30)) {
return false;
}
return true;
}
其中,parseStartDate和parseEndDate分别是解析开始结束时间的方法,isHoliday和isWorkingTime分别是判断某一天是否为法定假日或周末假日、以及是否在工作时间内的方法。
阅读全文