• LeetCode1360. 日期之间隔几天 做题笔记


    题目:

    请你编写一个程序来计算两个日期之间隔了多少天。

    日期以字符串形式给出,格式为 YYYY-MM-DD,如示例所示。

    示例 1:

    输入:date1 = “2019-06-29”, date2 = “2019-06-30”
    输出:1
    示例 2:

    输入:date1 = “2020-01-15”, date2 = “2019-12-31”
    输出:15

    提示:

    给定的日期是 1971 年到 2100 年之间的有效日期。

    思路与算法:

    日期一天一天递减效率不高。可以先按日,月,年的顺序依次直接转化为 1 日,1 月,1971 年,经过的天数可以直接计算得到。其中年份部分由于有闰年的因素,用 365 乘以年份之后,要再加上闰年的数量。闰年的数量不太好计算。我们采取以下策略:

    1. 先加上所有模 4 为 0 的年份的数量。此时有些模 100 为 0 的不是闰年的年份被加上了。
    2. 再减去所有模 100 为 0 的年份的数量。此时有些模 400 为 0 的是闰年的年份被减去了。
    3. 再加上所有模 400 为 0 的年份的数量。完成。

    大概思路就是,2个日期都跟公元元年比,公元元年元日是公元1年1月1日,先把day归1,然后再把月归1,最后把年归1,比如2015年6月9日,9日相对1日,多出9-1=8天,
    这样日期就是2015年6月9日了,然后再把月归一,分别减去前一个月的天数,从6月开始,6月1日到5月1日之间,差出整整5月份的天数,以此类推,归到1月1日后,
    如果给定开始的日期大于等于3月1日,那么还需要在归1的时候,加上一个2月29日的一天(如果是闰年),最后把年归一,这里要看看闰年的定义,能被4整除,不能被100整除,
    或者能被400整除的算闰年,于是先算算给定年份到公元1年,之间有多少个闰年,这里为什么需要year-1再除以4呢?比如给定日期是2012年x月x日,归1话日期以后,就是2012年,1月1日
    当年的闰年,完全不算在内,所以要判断year-1以及以前的日期,有几个能被4整除的年份,然后再减去能被100整除的年份,其中,能被400整除的年份还要加回来,这样就ok了。

    作者:LineCutFeng
    链接:https://leetcode-cn.com/problems/number-of-days-between-two-dates/solution/shuang-100zhe-ke-neng-shi-ni-kan-dao-de-javati-jie/
    来源:力扣(LeetCode)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    代码:

    
    
    class Solution {
        int[] _365M = new int[]{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    
        public int daysBetweenDates(String date1, String date2) {
            int[] dates1 = parseDate(date1), dates2 = parseDate(date2);
            return Math.abs(calculateDays(dates1[0], dates1[1], dates1[2]) - calculateDays(dates2[0], dates2[1], dates2[2]));
        }
    
        int calculateDays(int year, int month, int day) {
            int dayC1 = day - 1;
            for (int i = month; i > 1; i--) dayC1 += _365M[i - 1 - 1];
            if ((year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) && month > 2) dayC1++;
            dayC1 += (365 * (year - 1) + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400);
            return dayC1;
        }
    
        int[] parseDate(String date) {
            return new int[]{Integer.valueOf(date.substring(0, 4)), Integer.valueOf(date.substring(5, 7)), Integer.valueOf(date.substring(8, 10))};
        }
    }
    
  • 相关阅读:
    CG_Lession
    linux学习网站大全[转]
    C++ books
    Linux 建议学习路径[转]
    talking C++ STL
    Factory
    计算机图像图形学相关好书推荐
    ASP.NET控件缩写大全
    web开发面试题一
    ASP.Net面试题之二
  • 原文地址:https://www.cnblogs.com/nmydt/p/14256389.html
Copyright © 2020-2023  润新知