likes
comments
collection
share

LeetCode刷题-一年中的第几天

作者站长头像
站长
· 阅读数 6

前言说明

算法学习,日常刷题记录。

题目连接

一年中的第几天

题目内容

给你一个按YYYY-MM-DD格式表示日期的字符串date,请你计算并返回该日期是当年的第几天。

通常情况下,我们认为1月1日是每年的第1天,1月2日是每年的第2天,依此类推。每个月的天数与现行公元纪年法(格里高利历)一致。

示例1:

输入:date = "2019-01-09"

输出:9

示例2:

输入:date = "2019-02-10"

输出:41

示例3:

输入:date = "2003-03-01"

输出:60

示例4:

输入:date = "2004-03-01"

输出:61

提示:

date.length == 10

date[4] == date[7] == '-',其他的date[i]都是数字

date表示的范围从1900年1月1日至2019年12月31日

分析过程

第一步

根据横杠"-",切割输入的字符串date,切割出字符串数组strs,分别为年字符串、月字符串、日字符串。

第二步

获取年year,通过直接转年字符串strs[0]为整数获取。

获取月month,若月字符串strs[1]以0开头,那么取0之后的月字符串strs[1]转为整数;若月字符串strs[1]不以0开头,那么直接转月字符串strs[1]为整数。

获取日day,若日字符串strs[2]以0开头,那么取0之后的日字符串strs[2]转为整数;若日字符串strs[2]不以0开头,那么直接转日字符串strs[2]为整数。

第三步

计算年year是否为闰年,若年year是100的倍数,判断是否被400整除,被400整除的才是闰年;若年year不是100的倍数,判断是否被4整除,被4整除的才是闰年。

第四步

定义总天数sum,从1遍历到月month,总天数sum累加每一个月份的天数。

当月month是1、3、5、7、8、10、12月份时,总天数sum累加31。

当月month是4、6、9、11月份时,总天数sum累加30。

当月month是2月份时,判断年year是否为闰年,若是闰年,累加29,否则累加28。

第五步

总天数sum累加天day,得出结果返回。

解答代码

class Solution {
    public int dayOfYear(String date) {
        // 切割字符串,切割出年月日
        String[] strs = date.split("-");

        // 获取年,直接转字符串为整数
        int year = Integer.parseInt(strs[0]);

        // 获取月
        int month;
        if (strs[1].startsWith("0")) {
            // 若月以0开头,那么取0之后的字符串转为整数
            month = Integer.parseInt(strs[1].substring(1, 2));
        } else {
            // 若月不以0开头,那么直接转字符串为整数
            month = Integer.parseInt(strs[1]);
        }

        // 获取日
        int day;
        if (strs[2].startsWith("0")) {
            // 若日以0开头,那么取0之后的字符串转为整数
            day = Integer.parseInt(strs[2].substring(1, 2));
        } else {
            // 若日不以0开头,那么直接转字符串为整数
            day = Integer.parseInt(strs[2]);
        }

        // 是否闰年
        boolean isLeapYear;

        // 计算年是否为闰年
        if (year % 100 == 0) {
            // 若是100的倍数,判断是否被400整除
            isLeapYear = year % 400 == 0;
        } else {
            // 若不是100的倍数,判断是否被4整除
            isLeapYear = year % 4 == 0;
        }

        // 定义总天数
        int sum = 0;

        // 遍历月,总天数累加月份的天数
        for (int i = 1; i < month; ++i) {
            switch (i) {
                case 1:
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:
                case 12:
                    sum += 31;
                    break;
                case 4:
                case 6:
                case 9:
                case 11:
                    sum += 30;
                    break;
                case 2:
                    sum += isLeapYear ? 29 : 28;
                    break;  
            }
        }

        // 总天数最后累加上天数
        sum += day;

        return sum;
    }
}

提交结果

执行用时14ms,时间击败50.74%的用户,内存消耗38.7MB,空间击败77.28%的用户。

LeetCode刷题-一年中的第几天

原文链接

原文链接:一年中的第几天

转载自:https://juejin.cn/post/6987240902196461576
评论
请登录