题目描述
给你一个日期,请你设计一个算法来判断它是对应一周中的哪一天。
输入为三个整数:day
、month
和 year
,分别表示日、月、年。
您返回的结果必须是这几个值中的一个 {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}
。
样例
输入:day = 31, month = 8, year = 2019
输出:"Saturday"
输入:day = 18, month = 7, year = 1999
输出:"Sunday"
输入:day = 15, month = 8, year = 1993
输出:"Sunday"
限制
- 给出的日期一定是在
1971
到2100
年之间的有效日期。
算法
(暴力枚举)
- 我们从
1971
年的元旦开始一天一天枚举,1971
年的元旦是星期五。 - 注意特判闰年即可。
时间复杂度
- 时间复杂度和天数有关,不会枚举超过
50000
天。
空间复杂度
- 仅需要常数的空间记录每个月的天数和答案。
C++ 代码
class Solution {
public:
string dayOfTheWeek(int day, int month, int year) {
vector<string> days(8);
days[1] = "Monday";
days[2] = "Tuesday";
days[3] = "Wednesday";
days[4] = "Thursday";
days[5] = "Friday";
days[6] = "Saturday";
days[7] = "Sunday";
vector<int> md(13);
md[1] = 31;
md[2] = 28;
md[3] = 31;
md[4] = 30;
md[5] = 31;
md[6] = 30;
md[7] = 31;
md[8] = 31;
md[9] = 30;
md[10] = 31;
md[11] = 30;
md[12] = 31;
int cur_days = 5;
int y = 1971, m = 1, d = 1;
while (!(y == year && m == month && d == day)) {
d++;
cur_days++;
if (cur_days > 7)
cur_days = 1;
bool t = false;
if (y % 4 == 0 && y % 100 != 0 || y % 400 == 0)
t = true;
if (t && m == 2) {
if (d > 29) {
m++;
d = 1;
}
} else {
if (d > md[m]) {
m++;
d = 1;
}
}
if (m > 12) {
m = 1;
y++;
}
}
return days[cur_days];
}
};