[leetcode 周赛 149] 1154 一年中的第几天

1154 Day of the Year 一年中的第几天

描述

给你一个按 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 日

思路

  • 首先是字符串的处理
    YYYY-MM-DD 格式转换成整型的年月日

  • 其次是天数计算
    先将每月天数存入, 累加获取月份前几月的天数, 再加上获取日期的天数
    平年1~12月每月天数: {31,28,31,30,31,30,31,31,30,31,30,31}
    06-19 --> 06(19) 05(31) 04(30) 03(31) 02(28) 01(31)

  • 最后是判断闰年
    闰年的判断方法:

  1. 被4整除, 但不被100整除
  2. 被400整除
    闰年的二月比平年多一天

代码实现

class Solution {
    // 平年 每月天数 取巧使下标与月份匹配
    int[] mouths = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    
    public int dayOfYear(String date) {
        if (date.length() < 10) return 0;
        
        // 从字符串中获取年月日(整型)
        int y = getNum(date, 0, 4);
        int m = getNum(date, 5, 7);
        int d = getNum(date, 8, 10);
        
        // 先添加本月经过天数 在累加本月前的每月天数
        // 06-19 --> 06(19) 05(31) 04(30) 03(31) 02(28) 01(31)
        int ans = d;
        for (int i = 1; i < m; i++) {
            ans += mouths[i];
        }
        
        // 当月份过了二月 再判断年份是否是闰年
        if (m >= 3) {
            if ((y%4==0 && y%100!=0) | (y%400==0)) ans++;
        }
        
        return ans;
    }
    
    int getNum(String str, int s, int e) {
        int num = 0;
        for (int i = s; i < e; i++) {
            num = num*10 + (str.charAt(i)-'0');
        }
        return num;
    }
}
原文地址:https://www.cnblogs.com/slowbirdoflsh/p/11363859.html