[解题报告]《算法零基础100讲》(第6讲) 日期算法

一、一周中的第几天

力扣:1185.一周中的第几天

题目描述

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

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

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

提示:

  • 给出的日期一定是在 19712100 年之间的有效日期。
思路分析

模拟日期题目,首先我们知道1971年1月1日是周五,我们需要计算出给定的日期距离1971年1月1日有多少天然后%7即可。

注意:闰年为366天,以及闰年的2月份为29天。

具体代码
class Solution {
public:
    bool is_leapyear(int year){
        if((year%4==0 && year%100!=0) || year%400==0)
            return true;
        return false;
    }
    string dayOfTheWeek(int day, int month, int year) {
        //1971 1 1 星期五
        int m[12]={31,28,31,30,31,30,31,31,30,31,30,31};
        string a[7]={"Friday", "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday"};
        int sum=0;
        for(int i=1971;i<year;i++){
            if(is_leapyear(i)){
                sum+=366;
            }else{
                sum+=365;
            }
        }
        is_leapyear(year)?m[1]=29:m[1]=28; 
        for(int i=1;i<month;i++){
            sum+=m[i-1];
        }
        sum+=day;
        return a[(sum-1)%7];
    }
};

二、一年中的第几天

力扣:1154.一年中的第几天

题目描述

给你一个字符串 date ,按 YYYY-MM-DD 格式表示一个 现行公元纪年法 日期。请你计算并返回该日期是当年的第几天。

通常情况下,我们认为 1 月 1 日是每年的第 1 天,1 月 2 日是每年的第 2 天,依此类推。每个月的天数与现行公元纪年法(格里高利历)一致。

思路分析

直接模拟即可,需要判断是否是闰年。

具体代码
class Solution {
public:
    int strToint(char * s,int len){
        int sum=0;
        for(int i=0;i<len;i++){
            sum=sum*10+s[i]-'0';
        }
        return sum;
    }
    bool is_leap(int year){
        if((year%4==0 && year%100!=0) || year%400==0)
            return true;
        return false;
    }
    int dayOfYear(string date) {
        char da[10];
        for(int i=0;i<date.size();i++)
            da[i]=date[i];
        int y=strToint(da,4);
        int m=strToint(da+5,2);
        int d=strToint(da+8,2);
        int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
        int ans=0;
        is_leap(y)?month[1]=29:month[1]=28;
        for(int i=1;i<m;i++){
            ans+=month[i-1];
        }
        ans+=d;
        return ans;
    }
};

三、日期之间间隔几天

力扣:1360.日期之间间隔几天

题目描述

请你编写一个程序来计算两个日期之间隔了多少天。

日期以字符串形式给出,格式为 YYYY-MM-DD

提示:

  • 给定的日期是 1971 年到 2100 年之间的有效日期。
思路分析

要求两个日期的之间隔了多少天,我们可以求出它们距离1971年1月1日有多少天,然后计算二者之间的差值,就是两个日期之间间隔了多少天。

具体代码
class Solution {
public:
    bool isleap(int y){
        if((y%4==0 && y%100!=0) || y%400==0)    return true;
        return false;
    }
    int strToint(char* s,int len){
        int ans=0;
        for(int i=0;i<len;i++){
            ans=ans*10+s[i]-'0';
        }
        return ans;
    }
    int ddistance(int y,int m,int d){
        int sum=0;
        for(int i=1971;i<y;i++){
            if(isleap(i))   sum+=366;
            else    sum+=365;
        }
        isleap(y)?month[1]=29:month[1]=28;
        for(int i=1;i<m;i++){
            sum+=month[i-1];
        }
        sum+=d;
        return sum;
    }
    int month[12]={31,28,31,30,31,30,31,31,30,31,30,31};
    char dat1[10];
    char dat2[10];
    void strToch(string date,char* s){
        for(int i=0;i<date.size();i++)
            s[i]=date[i];
    }
    int daysBetweenDates(string date1, string date2) {
        strToch(date1,dat1);
        strToch(date2,dat2);
        int y1=strToint(dat1,4);
        int m1=strToint(dat1+5,2);
        int d1=strToint(dat1+8,2);
        int y2=strToint(dat2,4);
        int m2=strToint(dat2+5,2);
        int d2=strToint(dat2+8,2);
        int days1=ddistance(y1,m1,d1);
        int days2=ddistance(y2,m2,d2);
        return fabs(days1-days2);
    }
};
  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值