一年中的第几天
难度:
标签:
题目描述
代码结果
运行时间: 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天而不是根据实际年份直接设置?
▷🦆
题解中闰年的判断条件为`((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)`有什么不同?
▷🦆
在计算过程中,为什么要在计算完所有月份的天数之后再单独检查是否为闰年并增加一天,而不是在月份天数列表中直接调整2月的天数?
▷🦆
如果输入的日期是闰年的2月29日,当前的算法逻辑是否能正确处理并返回正确的天数?
▷