How to Compute the Day of the Year?

  • 时间:2020-09-20 14:08:18
  • 分类:网络文摘
  • 阅读:89 次

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.

C++ Algorithm to Count the Days Before the Date

To count the days given a date string of ISO 8601 format, we need to first parse/extract the string into three integers: year, month and day.

Then, we need to check if the year is a leap year (which we can use the little function described in How to Determine the Leap Year?).

For February, if it is leap year, we need to add one more day i.e. 29 days in a leap year. For January, March, May, July, August, October, December, there are 31 days, all others (except February which is 28 days in non-leap year), are 30 days.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Solution {
public:
    int dayOfYear(string date) {
        int year = std::stoi(date.substr(0, 4));
        int month = (date[5] - '0') * 10 +
            date[6] - '0';
        int day = (date[8] - '0') * 10 +
            date[9] - '0';
        int ans = 0;
        for (int i = 1; i < month; ++ i) {
            switch (i) {
                case 1:
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:
                case 12:
                    ans += 31;
                    break;
                case 2:
                    if (isLeap(year)) {
                        ans += 29;
                    } else {
                        ans += 28;
                    }
                    break;
                default:
                    ans += 30;
            }
        }
        return ans + day;
    }
private:
    bool isLeap(int year) {
        if (year % 400 == 0) return true;
        if (year % 100 == 0) return false;
        if (year % 4 == 0) return true;
        return false;
    }
};
class Solution {
public:
    int dayOfYear(string date) {
        int year = std::stoi(date.substr(0, 4));
        int month = (date[5] - '0') * 10 +
            date[6] - '0';
        int day = (date[8] - '0') * 10 +
            date[9] - '0';
        int ans = 0;
        for (int i = 1; i < month; ++ i) {
            switch (i) {
                case 1:
                case 3:
                case 5:
                case 7:
                case 8:
                case 10:
                case 12:
                    ans += 31;
                    break;
                case 2:
                    if (isLeap(year)) {
                        ans += 29;
                    } else {
                        ans += 28;
                    }
                    break;
                default:
                    ans += 30;
            }
        }
        return ans + day;
    }
private:
    bool isLeap(int year) {
        if (year % 400 == 0) return true;
        if (year % 100 == 0) return false;
        if (year % 4 == 0) return true;
        return false;
    }
};

Then, the counting should be pretty straightforward, which can be done in O(1) constant, in both time and space.

–EOF (The Ultimate Computing & Technology Blog) —

推荐阅读:
某校一年级同学平均身高是115厘米  若这稿件由乙完成,需要几小时?  从上边剪下一块直径是80厘米的圆片  甲乙丙三个修路队共同修完一条公路  最多可做多少面小三角旗  客车从甲地开往乙地需要10小时  遇店加一半,遇花喝一斗  这些车共有86个轮子  wordpress使用短代码实现在父页面中显示子页面列表链接  使用 wordpress 插件 Backend Designer 自定义后台颜色风格 
评论列表
添加评论