LeetCode 1185.一周中的第几天【c++】

G.X.Y~苏 河南科技大学 软件工程  2022-01-03 16:54:04

一、题目

给你一个日期,请你设计一个算法来判断它是对应一周中的哪一天。

输入为三个整数:day、month 和 year,分别表示日、月、年。

您返回的结果必须是这几个值中的一个 {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}。

示例1:

输入:day = 31, month = 8, year = 2019
输出:"Saturday"

示例2:

输入:day = 18, month = 7, year = 1999
输出:"Sunday"

示例3:

输入:day = 15, month = 8, year = 1993
输出:"Sunday"

提示:

 

  • 给出的日期一定是在 1971 到 2100 年之间的有效日期。

二、方法一:

这个日期是在1971年往后的,因此,我们可以先算出1971年至今一共有多少天。计算过程中要注意闰年问题,同时也要注意1971年1月1日是周五。

class Solution {
public:
    string dayOfTheWeek(int day, int month, int year) {
        string week[7]={"Friday","Saturday","Sunday","Monday","Tuesday","Wednesday","Thursday"};    1971年第一天为周五,因此这样排列更方便
        int Mon[12]={31,28,31,30,31,30,31,31,30,31,30,31};

        int count=0;
        for(int i=year-1;i>1971;i--){
            if((i%4==0 && i%100!=0) || i%400==0)
            count++;
        }
        int yearNum=365*(year-1971)+count;      //1971年到上一年的总天数
        
        int monthNum=0;
        for(int i=0;i<month-1;i++){
            if((year%4==0 && year%100!=0) || year%400==0){
                Mon[1]=29;
            }
            else{
                Mon[1]=28;
            }
            monthNum+=Mon[i];       //这一年,到上个月的总天数
        }
        
        int sum=yearNum+monthNum+day-1;
        int n=sum%7;
        return week[n];       

    }
};

 

三、方法二:

蔡勒公式:

(来自百度百科搜索)

蔡勒(Zeller)公式,是一个计算星期的公式,随便给一个日期,就能用这个公式推算出是星期几。

1,2月要当成上一年的13,14月计算。

公式:

 

w:星期;0--周日;1--周一……

c:世纪

y:年

m:月;1.在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算(eg.2020.1.3要看做2019.13.3);2. 3<=m<=14

d:日

[]:表示取整,只要整数部分。

class Solution {
public:
    string dayOfTheWeek(int day, int month, int year) {
        string week[7]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
        if(month<3){
            month+=12;
            year-=1;
        }
        int c=year/100;    //世纪
        year%=100;     //年
        int w=c/4-2*c+year+year/4+13*(month+1)/5+day-1+210;//减的内容最大为199,为防止w为负数,则可加上一个大于199且为7的倍数的数字,如:210
        return week[w%7];  
    }
};

 

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/day-of-the-week

...全文
307 1 打赏 收藏 举报
写回复
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
打卡
  • 打赏
  • 举报
回复
相关推荐
发帖
Java全栈抱团学习社区
加入

6.6w+

社区成员

欢迎大家来到抱团内卷学习社区,在这里大家可以分享自己的学习笔记,求职心得,一起记录彼此的成长历程。社区群号:94108843,WX公众号:【兴趣使然的草帽路飞】
社区管理员
  • 兴趣使然的草帽路飞
  • 一百个Chocolate
  • 灰小猿
帖子事件
创建了帖子
2022-01-03 16:54
社区公告

最怕你一生碌碌无为,还安慰自己平凡可贵!

努力提高自己的知识储备,助力每一位冲刺大厂的小伙伴!

祝大家前程似锦,offer连连!

注意:每个月活跃积分最高的小伙伴,可以获得社区管理员权限哦!