首页 > 试题广场 >

永远有多远

[编程题]永远有多远
  • 热度指数:220 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
XX是途虎养车的一名技术人员,同时也是校招的形象大使,由于忙于直播荒废了项目进度。

他想写一个程序来计算项目进度,请你帮他写一个函数,计算两个日期间,还有多少个工作日可供工作。
示例1

输入

2020,9,25,2020,9,28

输出

1

说明

从2020年9月25日00:00 到 2020年9月28日 00:00,只有一个工作日,即2020年9月25日

备注:
1. 这里的工作日是指从周一到周五,不考虑法定节假日和换休;
2. 这里假设历法按现行历法,没有更改过;也即是说公元1年1月1日在此假设下是星期一
3. 日期皆是指当天0:00为准,即输入的2020-09-08,是指2020-09-08 00:00。
4. 输入的日期都是在此假设下合法的,所有输入都是正数
刚开头算法没错,但是被一些很奇葩的例子卡住了,比如起始时间大于结束时间,真够无聊的。。。
还有一些节假日没考虑了,不知道咋考虑。。。

思路:
0)求出所有的天数allDays;
1)先找出起始时间和结束时间位于星期几,并计算起始时间到周日【包括周日】的天数,结束时间到上周日的天数【不包括结束那天】;
2)allDays减去上面两个多余的天数,其中就是n个完整的星期,再减去这些星期的周末天数;
3)另外加上1)中包含的可能的工作天数,就是最终结果了。
import java.util.*;
import java.time.*;
import java.time.temporal.*;

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 
     * @param y1 int整型 当前日期的年
     * @param m1 int整型 当前日期的月
     * @param d1 int整型 当前日期的日
     * @param y2 int整型 项目截止日期的年
     * @param m2 int整型 项目截止日期的月
     * @param d2 int整型 项目截止日期的日
     * @return int整型
     */
    public int workdays_between (int y1, int m1, int d1, int y2, int m2, int d2) {
        LocalDate start = LocalDate.of(y1, m1, d1);
        LocalDate end = LocalDate.of(y2, m2, d2);
        long days = start.until(end, ChronoUnit.DAYS);
        if (days < 0) {
            return 0;
        }
        DayOfWeek sd = start.getDayOfWeek();
        DayOfWeek ed = end.getDayOfWeek();
        int shas = DayOfWeek.SUNDAY.getValue() - sd.getValue() + 1;
        int ehas = ed.getValue() - DayOfWeek.MONDAY.getValue();
        long allDays = days - shas - ehas;
        long weekdays = allDays - allDays / 7 * 2;
        if (shas > 2) {
            weekdays += shas - 2;
        }
        weekdays += Math.min(5, ehas);
        return (int)weekdays;
    }

}


发表于 2022-03-15 10:46:45 回复(0)
获取两日期间天数,再减去两日期间周末天数
发表于 2021-03-17 16:48:06 回复(2)