写在最开始,这题很值得人吐槽一下……
1、先看题
题目也很清楚明了,再加上是简单题,所以我也没有多想,直接就用java api上了。
public String dayOfTheWeek(int day, int month, int year) {
LocalDate time = LocalDate.of(year, month, day);
return time.getDayOfWeek().toString();
}
可以说,这入参就是为了LocalDate
类设计的,心满意足点了提交,结果……
丫的,原来LocalDate
也不让用的吗?
前些天做的一年中的第几天时,我看题解有人提到,所以是这类复杂的工具类都不让用吗?
然后我就懵逼了。
要知道,求一年中的第几天的话是很容易的,毕竟第一天就是第一天,第二天就是第二天。
但是求星期就完全不一样了,毕竟你不知道第一天是星期几啊!
我冥思苦想,但完全想不出除了api外的其他法子。
于是投降去看了下官解。
就NM离谱!这又不是常识!能不能放到题干里啊!
你家日历挂到1970年的日期的吗?
你面试时能够和面试官说:稍等我查下日历 的吗?
差评!
2、思路
好吧,如果有对照的话,这题又简单回来了。
基本上是在一年中的第几天这题的基础上改改就可以。
只要知道输入的日期距离1970年12月31日有多少天的话,就可以得知该天是周几了。
开始吧。
3、动手
public String dayOfTheWeek(int day, int month, int year) {
String[] weekName = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
int[] DaysOfMonth = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30};
int sum = 0;
//计算当前年份和1971年间的日期差(仅到当前年份前一年)
for (int i = 1971; i < year; i++) {
sum += 365;
//遇上闰年+1
if (isLeapYear(i)) {
sum++;
}
}
//计算当月前的天数
for (int i = 0; i < month - 1; i++) {
sum += DaysOfMonth[i];
//如果当前年份是闰年,记得2月要多一天
if (i == 1 && isLeapYear(year)) {
sum++;
}
}
//加上日期
sum += day;
//日期+3再对7取余,得到一周的第几天
return weekName[(sum + 3) % 7];
}
/**
* 判断闰年的条件:
* 为400的整数倍,或为4但不为100的整数倍
*
* @param year 年份
* @return 是否为闰年
*/
private boolean isLeapYear(int year) {
return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
}
关于闰年的判断依旧是直接照搬之前的。
其余的也没啥可讲的
4、提交
5、再看看大牛
本以为今天也没啥看头的,但大牛永远是大牛,简单题依旧玩出花来
来看看小白大牛的四种解法。您要是小白辣我这种就渣都不剩了啊
前两种还算是中规中矩,后两种数学公式一出,直接亮瞎我的狗眼。
大家看着学习吧……
6、总结
啊……假期要没了……