LeetCode——1185.一周中的第几天

LeetCode——1185.一周中的第几天,第1张

LeetCode——1185.一周中的第几天

通过万岁!!!

  • 题目:给定一个日期,返回是周几
  • 思路:java中有方法的,直接使用,是先将日期转成Date,但是这个题不允许好像,因为需要用到SimpleDateFormat对象。还有一种方法,就是查看举例最开始的一天有多少天,然后对7取余即可。1970 年 12 月 31 日是星期四。
  • 技巧:
    • 数组用来存储多少天,以及每月多少天。
    • 注意,还需要判断多少个闰年。
    • 以及这里面有取余的过程,还是需要额外注意的,这个再周期性题目中还是挺关键的。

伪代码

先定义两个数组,一个是月份对应的天数,一个是星期日-星期一。
判断有多少完整year-1971,然后乘365
然后循环计算多少个月贡献了多少天,注意这里不能到month,因为这个月没有过完。
计算这个月的多少天,也就是day。
然后计算有多少闰年,从1971开始
判断我们要求的这个是不是闰年,因为我们的月份数组中2月写的是28天,如果本年是闰年,并且月份已经过了2月,那么就需要再加1
最后我们算出的天数,是从星期五开始的,所以我们要加3(这样才能到星期四的位置)再对7取余。

java代码

class Solution {
    public String dayOfTheWeek(int day, int month, int year) {
        String[] weeks = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
        int[] monthToDay = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
        // 年
        int days = 365 * (year - 1971);// 多少个365
        // 月
        for (int i = 0; i < month - 1; i++) {// 这里month需要-1,因为当前月份没有过完
            days += monthToDay[i];
        }
        // 日
        days += day;
        // 闰年
        for (int i = 1971; i < year; i++) {
            if (i % 400 == 0 || (i % 4 == 0 && i % 100 != 0)) {
                days++;
            }
        }
        if ((year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) && month >= 3) {
            days++;
        }
        return weeks[(days + 3) % 7];
    }
}
  • 总结:题目不难,这个取余的方法,还是挺关键的。这里还可以改进,就是月份数组其实不用写12月的,因为用不到。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5695368.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存