一、一周中的第几天
题目描述
给你一个日期,请你设计一个算法来判断它是对应一周中的哪一天。
输入为三个整数:day、month 和 year,分别表示日、月、年。
您返回的结果必须是这几个值中的一个 {“Sunday”, “Monday”, “Tuesday”, “Wednesday”, “Thursday”, “Friday”, “Saturday”}。
提示:
- 给出的日期一定是在
1971
到2100
年之间的有效日期。
思路分析
模拟日期题目,首先我们知道1971年1月1日是周五,我们需要计算出给定的日期距离1971年1月1日有多少天然后%7即可。
注意:闰年为366天,以及闰年的2月份为29天。
具体代码
class Solution {
public:
bool is_leapyear(int year){
if((year%4==0 && year%100!=0) || year%400==0)
return true;
return false;
}
string dayOfTheWeek(int day, int month, int year) {
//1971 1 1 星期五
int m[12]={31,28,31,30,31,30,31,31,30,31,30,31};
string a[7]={"Friday", "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday"};
int sum=0;
for(int i=1971;i<year;i++){
if(is_leapyear(i)){
sum+=366;
}else{
sum+=365;
}
}
is_leapyear(year)?m[1]=29:m[1]=28;
for(int i=1;i<month;i++){
sum+=m[i-1];
}
sum+=day;
return a[(sum-1)%7];
}
};
二、一年中的第几天
题目描述
给你一个字符串 date ,按 YYYY-MM-DD 格式表示一个 现行公元纪年法 日期。请你计算并返回该日期是当年的第几天。
通常情况下,我们认为 1 月 1 日是每年的第 1 天,1 月 2 日是每年的第 2 天,依此类推。每个月的天数与现行公元纪年法(格里高利历)一致。
思路分析
直接模拟即可,需要判断是否是闰年。
具体代码
class Solution {
public:
int strToint(char * s,int len){
int sum=0;
for(int i=0;i<len;i++){
sum=sum*10+s[i]-'0';
}
return sum;
}
bool is_leap(int year){
if((year%4==0 && year%100!=0) || year%400==0)
return true;
return false;
}
int dayOfYear(string date) {
char da[10];
for(int i=0;i<date.size();i++)
da[i]=date[i];
int y=strToint(da,4);
int m=strToint(da+5,2);
int d=strToint(da+8,2);
int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
int ans=0;
is_leap(y)?month[1]=29:month[1]=28;
for(int i=1;i<m;i++){
ans+=month[i-1];
}
ans+=d;
return ans;
}
};
三、日期之间间隔几天
题目描述
请你编写一个程序来计算两个日期之间隔了多少天。
日期以字符串形式给出,格式为
YYYY-MM-DD
。提示:
- 给定的日期是
1971
年到2100
年之间的有效日期。
思路分析
要求两个日期的之间隔了多少天,我们可以求出它们距离1971年1月1日有多少天,然后计算二者之间的差值,就是两个日期之间间隔了多少天。
具体代码
class Solution {
public:
bool isleap(int y){
if((y%4==0 && y%100!=0) || y%400==0) return true;
return false;
}
int strToint(char* s,int len){
int ans=0;
for(int i=0;i<len;i++){
ans=ans*10+s[i]-'0';
}
return ans;
}
int ddistance(int y,int m,int d){
int sum=0;
for(int i=1971;i<y;i++){
if(isleap(i)) sum+=366;
else sum+=365;
}
isleap(y)?month[1]=29:month[1]=28;
for(int i=1;i<m;i++){
sum+=month[i-1];
}
sum+=d;
return sum;
}
int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
char dat1[10];
char dat2[10];
void strToch(string date,char* s){
for(int i=0;i<date.size();i++)
s[i]=date[i];
}
int daysBetweenDates(string date1, string date2) {
strToch(date1,dat1);
strToch(date2,dat2);
int y1=strToint(dat1,4);
int m1=strToint(dat1+5,2);
int d1=strToint(dat1+8,2);
int y2=strToint(dat2,4);
int m2=strToint(dat2+5,2);
int d2=strToint(dat2+8,2);
int days1=ddistance(y1,m1,d1);
int days2=ddistance(y2,m2,d2);
return fabs(days1-days2);
}
};