
LeetCode-Go 题解1154. Day of the Year——用 Go 精确计算日期在一年中的第几天【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go导读本文讲解 LeetCode 第 1154 题「Day of the Year」在开源项目 LeetCode-Go 中的解法给定一个YYYY-MM-DD格式的公历日期字符串返回它是当年的第几天。该题在仓库中被标记为Easy难度通过率约 50.3%见 README.md核心价值在于考察对日期字符串解析、闰年规则与时间差值计算的掌握。读完本文你将掌握一种直接复用 Go 标准库time包的极简实现以及它背后的计算原理、测试验证方式和复杂度边界。题目理解题目要求实现函数dayOfYear(date string) int输入一个长度为 10 的字符串格式为YYYY-MM-DD代表一个 公历Gregorian calendar 日期输出该日期是当年1 月 1 日起计的第几天。官方示例原文档leetcode/1154.Day-of-the-Year/README.md给出了 4 组标准示例输入日期输出第几天说明2019-01-0992019 年 1 月 9 日是当年第 9 天2019-02-1041非闰年1 月 31 天 2 月前 10 天2003-03-0160非闰年200331 28 12004-03-0161闰年200431 29 1体现闰年差异其中示例 3 与示例 4 的唯一区别是年份是否为闰年恰好用来验证闰年2 月 29 天对计算结果的影响。约束条件date.length 10格式严格固定date[4] date[7] -其余字符均为数字即格式必为YYYY-MM-DD日期范围限定在1900 年 1 月 1 日 至 2019 年 12 月 31 日之间。需要说明的是原文档「题目大意」一节存在一处明显的复制粘贴错误内容与 1157 题 MajorityChecker 的描述混淆与本题无关阅读时请以「题目」一节的英文原文为准。本文的实现与分析均基于题目原文与仓库实际源码。解题思路原文档「解题思路」一节的结论非常简洁给出一个时间字符串求出这一天是这一年当中的第几天。简单题依照题意处理即可。结合约束条件可以提炼出两条可行路线手工逐月累加按月份把之前各月的天数累加再加上当月天数其中 2 月天数需根据闰年规则能被 4 整除但不能被 100 整除或能被 400 整除动态确定利用标准库做差值把目标日期与当年 1 月 1 日都解析为time.Time两者相减得到time.Duration换算成天数再加 1 即可闰年逻辑由标准库自动处理。仓库解法采用的是第 2 条路线代码量最短且不易出错下面进入源码剖析。源码实现剖析仓库中的核心实现位于 leetcode/1154.Day-of-the-Year/1154. Day of the Year.go完整源码如下package leetcode import time func dayOfYear(date string) int { first : date[:4] -01-01 firstDay, _ : time.Parse(2006-01-02, first) dateDay, _ : time.Parse(2006-01-02, date) duration : dateDay.Sub(firstDay) return int(duration.Hours())/24 1 }逐行拆解其原理构造基准日date[:4]取出前 4 位年份拼接成YYYY-01-01即当年 1 月 1 日的字符串统一解析通过time.Parse(2006-01-02, ...)把2006-01-02这个 Go 特有的参考时间布局解析为time.Time。2006-01-02中的2006代表年、01代表月、02代表日这是 Go 标准库约定的时间布局模板必须原样书写不能使用YYYY-MM-DD这类占位符求时间差dateDay.Sub(firstDay)得到time.Duration表示两个时间点之间的纳秒级差值换算天数duration.Hours()把差值转为小时数/24得到整天数由于基准日是当年第 1 天所以最后 1补正得到「第几天」的结果。闰年处理的隐藏点代码中没有任何显式的闰年判断但time包内部使用真实公历规则解析日期2004-03-01与2004-01-01的差值天然包含 2 月的 29 天因此输出61而非60。这就是示例 3、4 设计为相邻年份的原因——用来验证标准库对闰年的正确处理。边界情况time.Parse的返回值被丢弃_这是因为题目约束已保证输入格式合法、日期在 19002019 年范围内解析必然成功若脱离该约束使用此函数需自行处理错误分支。测试用例验证仓库提供了配套单元测试 leetcode/1154.Day-of-the-Year/1154. Day of the Year_test.go其用例与题目示例一一对应qs : []question1154{ {para1154{2019-01-09}, ans1154{9}}, {para1154{2019-02-10}, ans1154{41}}, {para1154{2003-03-01}, ans1154{60}}, {para1154{2004-03-01}, ans1154{61}}, }测试结构遵循仓库统一的「para / ans」模式para1154封装输入参数one stringans1154封装期望输出one int再组合为question1154结构体逐条驱动dayOfYear并打印输入输出对照。这 4 组用例覆盖了年份首日01-09不跨月跨月但非闰年2019-02-10跨到 3 月且非闰年2003-03-01→ 60跨到 3 月且闰年2004-03-01→ 61。第四组用例正是验证闰年逻辑的关键。在该题目录下执行go test即可复现验证仓库根 go.mod 声明了module github.com/halfrost/LeetCode-GoGo 版本为 1.19。复杂度与通用性分析时间复杂度O(1)。time.Parse与差值运算均为常数时间操作与日期数值大小无关空间复杂度O(1)仅使用固定数量的局部变量。就本解法与手工累加方案对比而言手工方案需要维护每月天数数组[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]并额外实现闰年判断逻辑直观但代码量更大本解法把日期语义交给标准库代码更简洁、不易在闰年分支上出错。代价是依赖time包的时间布局约定需要开发者熟悉2006-01-02这一 Go 特有的参考时间写法。适用前提该实现依赖题目约束——输入格式严格为YYYY-MM-DD且日期合法。若需要处理任意格式的日期字符串或非法输入应补充解析错误处理。小结LeetCode-Go 仓库对 1154 题的解法展示了「让标准库承担领域语义」的工程思路用time.Parse完成日期解析用time.Duration完成天数换算将闰年、月份天数等琐碎规则全部封装进time包内部最终以 10 行不到的代码精确完成任务。对于日期类 LeetCode 题这一思路同样适用于 1185. Day of the Week 等同类问题可作为处理日期字符串类题目的通用范式参考。【免费下载链接】LeetCode-Go✅ Solutions to LeetCode by Go, 100% test coverage, runtime beats 100% | LeetCode 题解项目地址: https://gitcode.com/GitHub_Trending/le/LeetCode-Go创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考