美文网首页算法刷题
LeetCode刷题-一年中的第几天

LeetCode刷题-一年中的第几天

作者: 小鲨鱼FF | 来源:发表于2021-07-21 13:06 被阅读0次

    前言说明

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

    题目连接

    一年中的第几天

    题目内容

    给你一个按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://www.haomeiwen.com/subject/cvqdmltx.html