leetcode
leetcode 1101 ~ 1150
一年中的第几天

一年中的第几天

难度:

标签:

题目描述

代码结果

运行时间: 36 ms, 内存: 0.0 MB


/*
题目思路:
1. 将输入的日期字符串按'-'拆分为年、月、日。
2. 使用Java Stream将每个月的天数存储在一个列表中,考虑闰年的情况。
3. 根据输入的年月日,使用流的操作计算当年的第几天。
*/

import java.util.stream.IntStream;
import java.util.stream.Stream;

public class DayOfYearStream {
    public int dayOfYear(String date) {
        String[] parts = date.split("-");
        int year = Integer.parseInt(parts[0]);
        int month = Integer.parseInt(parts[1]);
        int day = Integer.parseInt(parts[2]);

        int[] daysInMonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

        if (isLeapYear(year)) {
            daysInMonth[1] = 29;
        }

        return IntStream.range(0, month - 1)
                        .map(i -> daysInMonth[i])
                        .sum() + day;
    }

    private boolean isLeapYear(int year) {
        return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
    }
}

解释

方法:

该题解首先定义了一个列表 `calendar`,该列表以0开始,接着是每个月的天数,不考虑闰年的2月份。接着,通过字符串分割,将输入日期的年、月、日提取出来并转换为整数。累加到目前月份之前所有月份的天数得到 `d`。如果当前年份是闰年并且日期在2月之后,额外加一天。判断闰年的条件是:年份能被4整除但不能被100整除,或者能被400整除。最后返回从年初到当前日期的总天数。

时间复杂度:

O(1)

空间复杂度:

O(1)

代码细节讲解

🦆
为什么在初始化每月天数的列表时,2月被默认设置为28天而不是根据实际年份直接设置?
在初始化月份天数列表时将2月默认设置为28天是为了简化问题的解决过程。这种方法使得列表可以直接初始化而不需要先判断输入的年份是否为闰年。然后通过后续的逻辑检查来调整闰年2月的天数。这样做的好处是代码更加清晰和易于管理,特别是在处理不同年份时不必重复初始化月份天数列表。
🦆
题解中闰年的判断条件为`((y % 100 and not y % 4) or (not y % 100 and not y % 400))`,这与通常的闰年判断`(y % 4 == 0 and y % 100 != 0) or (y % 400 == 0)`有什么不同?
题解中的闰年判断条件确实与常规的判断条件有所不同,实际上题解中的条件存在错误。标准的闰年判断条件是`(y % 4 == 0 and y % 100 != 0) or (y % 400 == 0)`,意味着年份应当能被4整除但不能被100整除,或者能被400整除。题解中的条件漏写了逻辑运算符的关系,正确的应该是`(y % 4 == 0 and y % 100 != 0) or (y % 400 == 0)`。
🦆
在计算过程中,为什么要在计算完所有月份的天数之后再单独检查是否为闰年并增加一天,而不是在月份天数列表中直接调整2月的天数?
这种设计选择是为了保持月份天数列表的统一性和简化逻辑处理。如果在列表中直接调整2月的天数,每次使用这个算法时都需要根据年份先判断并设置2月的天数,这样会使得代码更加复杂。通过在计算完所有月份天数后统一检查是否为闰年并适当增加一天,可以使得代码结构更简单,也易于理解和维护。
🦆
如果输入的日期是闰年的2月29日,当前的算法逻辑是否能正确处理并返回正确的天数?
是的,当前的算法逻辑可以正确处理闰年的2月29日。算法首先会计算到2月28日为止的天数,然后在检查年份是闰年且当前月份大于2月时,会在总天数中额外加一天。所以如果输入是闰年的2月29日,算法会正确地将这一天计算在内,返回正确的天数总和。

相关问题