给你一个按 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
思路:先判断在月份,将当前月份之前的月份天数和加起来,再加上当前月的日期也就是天数,再根绝闰年判断2月份的天数。
月份加和时,可以按照倒序将一年中的月份的天数排列在数组中,找到相应的月份,依次加和,2月份为28天,再根据闰年判断是否加1。
class Solution { public: int calcOfDay(int year,int month,int day){ int mon[12]={30,31,30,31,31,30,31,30,31,28,31,0};//日期按照倒序从11月份排列,12月份加上当月日期就好 int res=0; for(int i=12-month;i<12;i++) res+=mon[i]; if((month>2)&&((year%4==0&&year%100!=0)||year%400==0))//当月份超过两个月且为闰年时,日期加一 res++; res+=day; return res; } int dayOfYear(string date) { int year, month, day; string years = date.substr(0, 4); string months = date.substr(5, 2); string days = date.substr(8, 2); stringstream ss; ss << years; ss >> year; ss.clear(); ss << months; ss >> month; ss.clear(); ss << days; ss >> day; int res = calcOfDay(year, month, day); return res; } };
string的substr用法sbustr(int index,int len);从index起始位置截取长度为len的字符串。