leetcode算法刷题报告(日期的计算)

目录

👻 本次所用方法

 🤷‍♀️ first  闰年判定

🤷‍♂️ second 有效处理润平年

👍 third  日期间对比天数

🐹 题目与解 

 🧐 题目一

 😒 题目二

 😶 题目三


 

👻 本次所用方法

 

 🤷‍♀️ first  闰年判定

对于日期计算,首先要引入闰年的判定,判断闰年有两种方法

bool is_leap(int year)
{
    return (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);
}

%400为0或者%4为0%100不为0

 

🤷‍♂️ second 有效处理润平年

每次出现闰年会导致计算不好算,因此,我们可以通过一种方法让计算变得简洁 

bool is_leap(int year)
{
    return (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);
}
char * date(int day, int month, int year)
{
     int sum= 0;
    if(month > 2 && is_leap(year))
        sum += 1 + day;
    else
        sum += day;
}

 判断闰年,判断月份是否大于2,同时满足天数加一即可。

👍 third  日期间对比天数

两日期对比天数比较麻烦,如果直接比较那就必须判定闰平年,看年月日是否相同,这里,我们可以采取一个更好的办法,前提是知道对比的范围的最小值

bool is_leap(int year)
{
    return (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);
}
int _sum(int year,int month,int day,int* days)
{
    int sum=0;
         for(int i = 1971; i < year; i++)
    {
        if(is_leap(i))
            sum += 366;
        else
            sum += 365;
    }
        for(int i = 1; i < month; i++)
    {
        sum += days[i];
    }

    if(month > 2 && is_leap(year))
        sum += 1 + day;
    else
        sum += day;
        return sum;
}

使用_sum函数计算出两日期与1971的天数,再相减求绝对值 

 

🐹 题目与解 

 

 

 🧐 题目一

 

1185. 一周中的第几天

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

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

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

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

本题需要用数组把每个月的天数存起来,最好也把星期存起来,写起来没那么麻烦

bool is_leap(int year)
{
    return (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);
}

char * dayOfTheWeek(int day, int month, int year)
{
    char* ans[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
    int days[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    int sum= 0;
    for(int i = 1971; i < year; i++)
    {
        if(is_leap(i))
            sum += 366;
        else
            sum += 365;
    }

    for(int i = 1; i < month; i++)
    {
        sum += days[i];
    }

    if(month > 2 && is_leap(year))
        sum += 1 + day;
    else
        sum += day;
    return ans[(5 + sum - 1) % 7];
}

 😒 题目二

1154. 一年中的第几天

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

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

输入:date = "2019-01-09"
输出:9

此题需要注意把字符变成数字,减‘0’即可做到

bool is_leap(int year)
{
    return (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);
}
int dayOfYear(char * date){
    int year = (date[0] - '0') * 1000 + (date[1] - '0') * 100 + (date[2] - '0') * 10 + date[3] - '0';
    int month = (date[5] - '0') * 10 + date[6] - '0';
    int day = (date[8] - '0') * 10 + date[9] - '0';
int t=0;
int days[12] = {31,28,31,30,31,30,31,31,30,31,30,31};
for(int i=0;i<month-1;i++)
{
  t+=days[i];
}
if(month>2&&is_leap(year))
return t+day+1;
return t+day;
}

 😶 题目三

1360. 日期之间隔几天

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

日期以字符串形式给出,格式为 YYYY-MM-DD,如示例所示。

输入:date1 = "2019-06-29", date2 = "2019-06-30"
输出:1

此题方法已在前面说过,就不再赘述

bool is_leap(int year)
{
    return (year % 400 == 0) || (year % 4 == 0 && year % 100 != 0);
}
int _sum(int year,int month,int day,int* days)
{
    int sum=0;
         for(int i = 1971; i < year; i++)
    {
        if(is_leap(i))
            sum += 366;
        else
            sum += 365;
    }
        for(int i = 1; i < month; i++)
    {
        sum += days[i];
    }

    if(month > 2 && is_leap(year))
        sum += 1 + day;
    else
        sum += day;
        return sum;
}
int daysBetweenDates(char * date1, char * date2){
    int year1 = (date1[0] - '0') * 1000 + (date1[1] - '0') * 100 + (date1[2] - '0') * 10 + date1[3] - '0';
    int month1 = (date1[5] - '0') * 10 + date1[6] - '0';
    int day1 = (date1[8] - '0') * 10 + date1[9] - '0';
    int year2 = (date2[0] - '0') * 1000 + (date2[1] - '0') * 100 + (date2[2] - '0') * 10 + date2[3] - '0';
    int month2 = (date2[5] - '0') * 10 + date2[6] - '0';
    int day2 = (date2[8] - '0') * 10 + date2[9] - '0';
    int sum1=0;int sum2=0;
    int days[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    sum1=_sum(year1,month1,day1,days);
    sum2=_sum(year2,month2,day2,days);
    if(sum2>sum1)
    return sum2-sum1;
    return sum1-sum2;
}

 三种时间复杂度都较低属于以空间换时间的算法。

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Shany-Ming

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值