跳至主要內容

1154. 一年中的第几天


1154. 一年中的第几天

🟢   🔖  数学 字符串  🔗 力扣open in new window LeetCodeopen in new window

题目

Given a string date representing a Gregorian calendaropen in new window 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

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 31th, 2019.

题目大意

给你一个字符串 date ,按 YYYY-MM-DD 格式表示一个 现行公元纪年法open in new window 日期。返回该日期是当年的第几天。

示例 1:

输入: date = "2019-01-09"

输出: 9

解释: 给定日期是 2019 年的第九天。

示例 2:

输入: date = "2019-02-10"

输出: 41

提示:

  • date.length == 10
  • date[4] == date[7] == '-',其他的 date[i] 都是数字
  • date 表示的范围从 1900 年 1 月 1 日至 2019 年 12 月 31 日

解题思路

  1. 提取年份、月份和日期
    从输入的字符串 date 中提取出年份、月份和日期。

  2. 判断是否是闰年
    由于闰年 2 月有 29 天,需要根据年份判断该年是否为闰年:

    • 闰年的判断规则是:如果年份能被 4 整除且不能被 100 整除,或者能被 400 整除,则是闰年。
  3. 计算从 1 月 1 日到给定日期的天数
    我们可以通过一个数组存储每个月的天数,普通年份中:

    • 1 月:31 天
    • 2 月:28 天
    • 3 月:31 天
    • 4 月:30 天
    • ...

    如果是闰年,那么 2 月就有 29 天。

  4. 累加从 1 月 1 日到给定日期的天数
    从 1 月到前一个月的天数之和再加上当前月的天数,即可得到给定日期是当年的第几天。

复杂度分析

  • 时间复杂度O(1)
    • 字符串拆分和映射操作是 O(1) 的操作。
    • 累加天数部分的时间复杂度是 O(1),因为数组长度是固定的(12 个月)。
  • 空间复杂度O(1),使用了一个常量大小的数组 daysInMonth

代码

/**
 * @param {string} date
 * @return {number}
 */
var dayOfYear = function (date) {
	const daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; // 普通年份的每月天数

	// 提取年份、月份和日期
	const [year, month, day] = date.split('-').map(Number);

	// 判断是否是闰年
	const isLeapYear = (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;

	// 如果是闰年,2月的天数为29天
	if (isLeapYear) {
		daysInMonth[1] = 29;
	}

	// 计算从1月1日到给定日期的天数
	let days = 0;
	for (let i = 0; i < month - 1; i++) {
		days += daysInMonth[i];
	}

	days += day; // 加上当前月的天数

	return days;
};