1154 Day of the Year 一年中的第几天
描述
给你一个按 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 日。
思路
-
首先是字符串的处理
将YYYY-MM-DD
格式转换成整型的年月日 -
其次是天数计算
先将每月天数存入, 累加获取月份前几月的天数, 再加上获取日期的天数
平年1~12月每月天数: {31,28,31,30,31,30,31,31,30,31,30,31}
06-19 --> 06(19) 05(31) 04(30) 03(31) 02(28) 01(31) -
最后是判断闰年
闰年的判断方法:
- 被4整除, 但不被100整除
- 被400整除
闰年的二月比平年多一天
代码实现
class Solution {
// 平年 每月天数 取巧使下标与月份匹配
int[] mouths = {0,31,28,31,30,31,30,31,31,30,31,30,31};
public int dayOfYear(String date) {
if (date.length() < 10) return 0;
// 从字符串中获取年月日(整型)
int y = getNum(date, 0, 4);
int m = getNum(date, 5, 7);
int d = getNum(date, 8, 10);
// 先添加本月经过天数 在累加本月前的每月天数
// 06-19 --> 06(19) 05(31) 04(30) 03(31) 02(28) 01(31)
int ans = d;
for (int i = 1; i < m; i++) {
ans += mouths[i];
}
// 当月份过了二月 再判断年份是否是闰年
if (m >= 3) {
if ((y%4==0 && y%100!=0) | (y%400==0)) ans++;
}
return ans;
}
int getNum(String str, int s, int e) {
int num = 0;
for (int i = s; i < e; i++) {
num = num*10 + (str.charAt(i)-'0');
}
return num;
}
}