数据结构和算法分析数据结构与算法

Leetcode-1360 日期之间隔几天

2021-11-03  本文已影响0人  itbird01

1360. 日期之间隔几天

解题思路

1.分析题意,了解平闰年区别和天数
2.先将data1、data2 string转换为整数
3.如果年月相等,则只需取日的差值的绝对值即可
4.计算year1到year2之间有多少天
5.如果年相等,则需要判断小月到大月的天数
6.如果不相等,计算year1当年到年底,还有多少天,计算到year2年规定日期,还有多少天

解题遇到的问题

1.判断闰年和平年的方法,非整百年:能被4整除的为闰年,整百年:能被400整除的是闰年
2.平年和闰年的区别是,2月份分别有29天和28天
3.闰年有366天,平年有365天
4.每个月31天的有 1月、3月、5月、7月、8月、10月、12月

后续需要总结学习的知识点

##解法1
class Solution {
    public static void main(String[] args) {
        System.out.println(daysBetweenDates("2019-06-30", "2019-07-30"));
    }

    public static int daysBetweenDates(String date1, String date2) {
        // 判断闰年和平年的方法,除以4,如果商是整数,则为闰年,如果不是,则为平年
        // 平年和闰年的区别是,2月份分别有29天和28天
        // 先将data1、data2 string转换为整数
        String[] data1String = date1.split("-");
        String[] data2String = date2.split("-");
        int year1 = Integer.parseInt(data1String[0]);
        int year2 = Integer.parseInt(data2String[0]);
        if (year1 > year2) {
            return getTotalDays(data2String, data1String);
        } else {
            return getTotalDays(data1String, data2String);
        }
    }

    public static int getTotalDays(String[] data1String, String[] data2String) {
        int year1 = Integer.parseInt(data1String[0]);
        int year2 = Integer.parseInt(data2String[0]);
        int mon1 = Integer.parseInt(data1String[1]);
        int mon2 = Integer.parseInt(data2String[1]);
        int day1 = Integer.parseInt(data1String[2]);
        int day2 = Integer.parseInt(data2String[2]);

        int result = 0;
        // 如果年月相等,则只需取日的差值的绝对值即可
        if (year1 == year2 && mon1 == mon2) {
            return Math.abs(day1 - day2);
        }

        // 闰年有366天,平年有365天,计算year1到year2之间有多少天
        for (int i = year1 + 1; i < year2; i++) {
            if ((i % 4 == 0 && i % 100 != 0) || (i % 400 == 0)) {
                result += 366;
            } else {
                result += 365;
            }
        }
        // 每个月31天的有 1月、3月、5月、7月、8月、10月、12月
        boolean isYear1Run = (year1 % 4 == 0 && year1 % 100 != 0)
                || (year1 % 400 == 0);
        boolean isYear2Run = (year2 % 4 == 0 && year2 % 100 != 0)
                || (year2 % 400 == 0);
        if (year1 == year2) {
            // 如果年相等,则需要判断小月到大月的天数
            if (mon1 > mon2) {
                int temp = mon2;
                mon1 = mon2;
                mon2 = temp;
            }
            for (int i = mon1 + 1; i < mon2; i++) {
                result += getMonDays(isYear1Run, i);
            }
        } else {
            // 计算year1当年到年底,还有多少天
            for (int i = mon1 + 1; i < 13; i++) {
                result += getMonDays(isYear1Run, i);
            }
            // 计算到year2年规定日期,还有多少天
            for (int i = 1; i < mon2; i++) {
                result += getMonDays(isYear2Run, i);
            }
        }
        result = result + getMonDays(isYear1Run, mon1) - day1;
        result += day2;
        return result;
    }

    public static int getMonDays(boolean isRun, int x) {
        switch (x) {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            return 31;
        case 4:
        case 6:
        case 9:
        case 11:
            return 30;
        case 2:
            return isRun ? 29 : 28;
        }
        return 0;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读