题目要求是给定一个字符串 date,它代表一个日期,采用标准的 YYYY-MM-DD 格式。需要计算这个日期是当年的第几天。
首先,我们可以通过字符串的索引来提取年、月和日的数值,并将其转换为整数,例如:
int year = (date[0] - '0') * 1000 + (date[1] - '0') * 100 + (date[2] - '0') * 10 + (date[3] - '0');
int month = (date[5] - '0') * 10 + (date[6] - '0');
int day = (date[8] - '0') * 10 + (date[9] - '0');
接下来,可以利用月份的信息和闰年的判断,逐个累加每个月的天数,计算给定日期在当年的第几天。这个过程可以优化,无需逐个判断每个月的天数,可以通过数组预先存储每个月的天数信息:
int daysInMonth[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
这个数组的索引代表月份,数组的值代表该月的天数。然后利用闰年的条件,对二月的天数进行修改:
if ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0)) {
daysInMonth[2] = 29; // 闰年二月有29天
}
最后,利用循环累加到给定日期的前一个月,将当月的天数加上,即可得到该日期是当年的第几天:
int totalDays = 0;
for (int i = 1; i < month; ++i) {
totalDays += daysInMonth[i];
}
totalDays += day; // 加上当前月的天数
将得到的 totalDays 返回即可。
class Solution {
public:
int dayOfYear(string date) {
for(int i=0;i<date.size();++i)cout<<i<<' '<<date[i]<<endl;
int nianfen=(date[0]-'0')*1000+(date[1]-'0')*100+(date[2]-'0')*10+(date[3]-'0');
int yuefen=(date[5]-'0')*10+(date[6]-'0');
int riqi=(date[8]-'0')*10+(date[9]-'0');
//cout<<nianfen<<' '<<yuefen<<' '<<riqi;
if(yuefen>1)riqi+=31;
if(yuefen>2&&(nianfen%400==0||(nianfen%4==0&&nianfen%100!=0)))riqi+=29;
else if(yuefen>2)riqi+=28;
if(yuefen>3)riqi+=31;
if(yuefen>4)riqi+=30;
if(yuefen>5)riqi+=31;
if(yuefen>6)riqi+=30;
if(yuefen>7)riqi+=31;
if(yuefen>8)riqi+=31;
if(yuefen>9)riqi+=30;
if(yuefen>10)riqi+=31;
if(yuefen>11)riqi+=30;
return riqi;
}
};