Skip to content

[LeetCode] 1154. Day of the Year #1154

Open
@grandyang

Description

@grandyang

Given a string date representing a Gregorian calendar date formatted as YYYY-MM-DD, return the day number of the year.

Example 1:

Input: date = "2019-01-09"
Output: 9
Explanation: Given date is the 9th day of the year in 2019.

Example 2:

Input: date = "2019-02-10"
Output: 41

Example 3:

Input: date = "2003-03-01"
Output: 60

Example 4:

Input: date = "2004-03-01"
Output: 61

Constraints:

  • date.length == 10
  • date[4] == date[7] == '-', and all other date[i]'s are digits
  • date represents a calendar date between Jan 1st, 1900 and Dec 31, 2019.

这道题给了一个 年-月-日 的日期字符串,让我们返回该年已经过了多少天。关于每月各多少天,小学的时候就已经背的滚瓜烂熟了吧,一三五七八十腊,三十一天永不差。唯一有变化的就是二月了,闰年是 29 天,所以这里唯一的难点就是判断闰年了吧。先用个数组列出非闰年各个月的天数,然后分别从给定 date 字符串中提取出年月日,并转为整型数。然后将当前月之前的天数都累加到结果 res 中,接下来判断当前月是否大于2月,没有的话都不用判断闰年了。超过了2月就要判断当前年是否是闰年,判断方法很简单,若能被 400 整除,一定是闰年,或着不能被 100 整除,但能被4整除的也是闰年。是闰年的话就再多加一天,最后再加上当前的天数返回即可,参见代码如下:

class Solution {
public:
    int dayOfYear(string date) {
        vector<int> monthDays{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        int res = 0, year = stoi(date.substr(0, 4)), month = stoi(date.substr(5, 2)), day = stoi(date.substr(8, 2));
        for (int i = 0; i < month - 1; ++i) {
            res += monthDays[i];
        }
        if (month > 2 && (year % 400 == 0 || (year % 100 != 0 && year % 4 == 0))) {
            ++res;
        }
        return res + day;
    }
};

Github 同步地址:

#1154

参考资料:

https://leetcode.com/problems/day-of-the-year/

https://leetcode.com/problems/day-of-the-year/discuss/355916/C%2B%2B-Number-of-Days-in-a-Month

LeetCode All in One 题目讲解汇总(持续更新中...)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions