日期天数的映射类题目

105 阅读2分钟

日期到天数的映射类题目

核心思想

首先,我们需要把每个月的天数和月份对应的数字建立起映射关系
可以使用一个数组进行表示

int arr[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};

如此,便可以将月份数当作的对应天数数组的下标获得这个月的天数
然后,再根据年份判断是否为闰年,如果是闰年2月份的天数(arr[2])+1即可

计算日期到天数转换 HJ73

根据输入的日期,计算是这一年的第几天。 

保证年份为4位数且日期合法。 

进阶:时间复杂度:O(n) O(n) ,空间复杂度:O(1) O(1)

这道题我们就按照上面的思路,建立好天数与月份的映射关系,直接for循环到指定的月份,累加天数,再加上当月的天数的即可

#include <stdio.h>

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

int main()
{
    int arr[] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    int year=0,month=0,day=0;
    scanf("%d %d %d",&year,&month,&day);
    arr[2] = isLeapYear(year)?29:arr[2];
    int sum = 0;
    for(int i=1;i<month;i++)
    {
        sum+=arr[i];
    }
    sum+=day;
    printf("%d",sum);
    return 0;
}

两个具体日期相差的天数

思路: 要用到上面一题的结果, 可以想到的是, 如果在不同的年份, 中间还有间隔的年份的话, 那么总天数 = (小年天数-当天在该年的天数)+(间隔年份)* 对应年份的天数+当天在大年的天数

但如果在同一年,则不能采用这个计算方法,应该是直接第二个日期在当年的天数-第一个日期在当年的天数

统一一下, 应该是从第一年开始算起, 一直加到第二个日期的前一年, 再加上第二个日期的天数-第一个日期的天数

IMG_2BD1E043D5E2-1.jpeg

因此, 代码应该这样写:

#include <stdio.h>

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

int getDayOfYear(int year,int month,int day)
{
    int arr[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    arr[2] = isLeapYear(year) ? 29 : arr[2];
    int sum = 0;
    for (int i = 1; i < month; i++)
    {
        sum += arr[i];
    }
    sum += day;
    return sum;
}

int main()
{
    
    int year1=0,month1=0,day1=0;
    int year2=0,month2=0,day2=0;
    scanf("%d %d %d",&year1,&month1,&day1);
    scanf("%d %d %d",&year2,&month2,&day2);
    int days1 = getDayOfYear(year1,month1,day1);
    days1 = getDayOfYear(year2,month2,day2) - days1;
    int days2 = 0;
    for(int i=year1;i<year2;i++)
    {
        days2 += isLeapYear(i) ? 366 : 365;
    }
    printf("%d days",days1+days2);
    return 0;
}