思路:其实就是大模拟讨论,讨论出所有情况就好。因为X最多350,也就是一年中的每个日期最多只会出现一次,所以我们把起点到终点,按照平年算一下起点到终点要多少天,按照闰年算一下要多少天。详情见代码注释。
class Solution {
public:
/**
* @param inputQueries: input Queries, means [[m1, d1, m2, d2, x], [m1, d1, m2, d2, x],...]
* @return: guess whether y1 is leep year
*/
/* 1 2 3 4 5 6 7 8 9 10 11 12*/
int a[15]={0,31,28,31,30,31,30,31,31,30,31,30,31};///平年
int b[15]={0,31,29,31,30,31,30,31,31,30,31,30,31};///闰年
int m1,m2,d1,d2,c;
int getNum(int a[]){
int first=a[m1]-d1;
if(m1<m2 || m1==m2 && d1<=d2){
for(int i=m1+1;i<m2;i++) first+=a[i];
first+=d2;
}
else{
for(int i=m1+1;i<=12;i++) first+=a[i];
for(int i=1;i<m2;i++) first+=a[i];
first+=d2;
}
return first;
}
string guessYear(vector<vector<int>> &inputQueries) {
string ans="";
for(auto i:inputQueries){
m1=i[0],d1=i[1];
m2=i[2],d2=i[3];
c=i[4];
if(m1==2 && d1==29){///起点是2.29
ans+="R";
continue;
}
if(m2==2 && d2==29){///终点是2.29
if(m1<=m2) ans+="R";///没跨年
else ans+="P";///跨年了 第二年是 那么第一年一定是平年
continue;
}
int flag=0;
if(m1>m2 || m1==m2 && d1>d2) flag=1;///判断是否跨年
int q=getNum(a),w=getNum(b);///计算起点到终点 按照 平闰年的天数
if(q==w) ans+="?";///跟平闰年无关 说明起点和终点没有经过2月底 即2.29
else if(c==q) {///等于平年的天数
if(!flag) ans+="P";///没有跨年 在完整的一年 说明就是平年
else {///跨年了
if(m1==2 && d1<29 || m1==1) ans+="P";///第一年经过了2月份 说明第一年是平年
else ans+="?";///第一年没经过2月 说明第二年是平年 第一年就不确定
}
}
else if(c==w){///等于闰年的天数
if(!flag) ans+="R";///没跨年 第一年就是闰年
else {///跨年了
if(m1==2 && d1<29 || m1==1) ans+="R";///第一年经过了2月份 说明第一年是闰年
else ans+="P";///没经过二月份 说明第二年是闰年 那第一年一定是平年
}
}
else ans+="?";
}
return ans;
}
};