前言说明
算法学习,日常刷题记录。
题目连接
题目内容
给你一个按YYYY-MM-DD格式表示日期的字符串date,请你计算并返回该日期是当年的第几天。
通常情况下,我们认为1月1日是每年的第1天,1月2日是每年的第2天,依此类推。每个月的天数与现行公元纪年法(格里高利历)一致。
示例1:
输入:date = "2019-01-09"
输出:9
示例2:
输入:date = "2019-02-10"
输出:41
示例3:
输入:date = "2003-03-01"
输出:60
示例4:
输入:date = "2004-03-01"
输出:61
提示:
date.length == 10
date[4] == date[7] == '-',其他的date[i]都是数字
date表示的范围从1900年1月1日至2019年12月31日
分析过程
第一步
根据横杠"-",切割输入的字符串date,切割出字符串数组strs,分别为年字符串、月字符串、日字符串。
第二步
获取年year,通过直接转年字符串strs[0]为整数获取。
获取月month,若月字符串strs[1]以0开头,那么取0之后的月字符串strs[1]转为整数;若月字符串strs[1]不以0开头,那么直接转月字符串strs[1]为整数。
获取日day,若日字符串strs[2]以0开头,那么取0之后的日字符串strs[2]转为整数;若日字符串strs[2]不以0开头,那么直接转日字符串strs[2]为整数。
第三步
计算年year是否为闰年,若年year是100的倍数,判断是否被400整除,被400整除的才是闰年;若年year不是100的倍数,判断是否被4整除,被4整除的才是闰年。
第四步
定义总天数sum,从1遍历到月month,总天数sum累加每一个月份的天数。
当月month是1、3、5、7、8、10、12月份时,总天数sum累加31。
当月month是4、6、9、11月份时,总天数sum累加30。
当月month是2月份时,判断年year是否为闰年,若是闰年,累加29,否则累加28。
第五步
总天数sum累加天day,得出结果返回。
解答代码
class Solution {
public int dayOfYear(String date) {
// 切割字符串,切割出年月日
String[] strs = date.split("-");
// 获取年,直接转字符串为整数
int year = Integer.parseInt(strs[0]);
// 获取月
int month;
if (strs[1].startsWith("0")) {
// 若月以0开头,那么取0之后的字符串转为整数
month = Integer.parseInt(strs[1].substring(1, 2));
} else {
// 若月不以0开头,那么直接转字符串为整数
month = Integer.parseInt(strs[1]);
}
// 获取日
int day;
if (strs[2].startsWith("0")) {
// 若日以0开头,那么取0之后的字符串转为整数
day = Integer.parseInt(strs[2].substring(1, 2));
} else {
// 若日不以0开头,那么直接转字符串为整数
day = Integer.parseInt(strs[2]);
}
// 是否闰年
boolean isLeapYear;
// 计算年是否为闰年
if (year % 100 == 0) {
// 若是100的倍数,判断是否被400整除
isLeapYear = year % 400 == 0;
} else {
// 若不是100的倍数,判断是否被4整除
isLeapYear = year % 4 == 0;
}
// 定义总天数
int sum = 0;
// 遍历月,总天数累加月份的天数
for (int i = 1; i < month; ++i) {
switch (i) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
sum += 31;
break;
case 4:
case 6:
case 9:
case 11:
sum += 30;
break;
case 2:
sum += isLeapYear ? 29 : 28;
break;
}
}
// 总天数最后累加上天数
sum += day;
return sum;
}
}
提交结果
执行用时14ms,时间击败50.74%的用户,内存消耗38.7MB,空间击败77.28%的用户。
运行结果原文链接
原文链接:一年中的第几天
网友评论