原题链接

给你一个字符串 date ,按 YYYY-MM-DD 格式表示一个 现行公元纪年法 日期。请你计算并返回该日期是当年的第几天。通常情况下,我们认为 1 月 1 日是每年的第 1 天,1 月 2 日是每年的第 2 天,依此类推。每个月的天数与现行公元纪年法(格里高利历)一致。

示例 1:

输入:date = “2019-01-09”

输出:9

这题目其实一点都不难,但是初次提交的效果却很不好。后面换种方式实现,效果还不错,记录下。因为年月日都是相对固定的天数,所以可以用一个数组来保存天数,这样就可以不用频繁调用库函数了,节省时间。相对固定的变量就可以空间换时间,这是这道题最大的启发。

golang示例代码

 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
func dayOfYear(date string) int {
    strs := strings.Split(date, "-")
    year, month, date := strs[0], strs[1], strs[2]
    // 年,月,日相对固定,不要频繁调用函数计算
    y, _ := strconv.Atoi(year)
    m, _ := strconv.Atoi(month)
    d, _ := strconv.Atoi(date)
    if m == 1 {
        return d
    }
    add := 0
    if (y % 100 == 0 && y % 400 == 0) || (y % 4 == 0 && y % 100 != 0) {
        add = 1
    }
    // 2月比较特殊
    if m == 2 {
        return 31 + d
    }
    dates := []int{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
    total := 0
    // 从1月开始,去掉当前月
    for i := 1; i < m; i++ {
        total += dates[i]
    }
    return total + d + add
}