1360. 日期之间隔几天

力扣原题链接 日期之间隔几天


在这里插入图片描述


class Solution {
    bool leap_year(int year){
        return year%400==0||(year%100!=0&&year%4==0);
    }  //判断是不是闰年
    int date_to_int(string date){
        int year,month,day;
        sscanf(date.c_str(),"%d-%d-%d",&year,&month,&day);  //利用sscanf从字符串格式化写入到整型中
        int ans=0;
        int month_length[]={31,31,28,31,30,31,30,31,31,30,31,30};  //提前存好每个月的日期数,尤其注意,第0个为12月份的日期数,相当于把12放到了年初
        while(year!=1971 or month!=1 or day!=1){  //核心思路,就是和1971年1月1日比较,计算出相差多少天
            ++ans;
            if(--day==0){  //日期递减,到0该减月份了
                if(--month==0){  //月份递减,到0该减年份了
                    --year;  //年份递减,由while循环控制
                }
            }
            if(day==0){
                day=month_length[month];  //由于月份提前--过了,所以直接提取当前月的日期数,如果说是12月,则现在month为0
                if(month==2&&leap_year(year)){  //不仅要判断闰年,还要判断是2月
                    ++day;
                }
            }
            if(month==0){
                month=12;  //修正月份,变为12月的目的是,下一次--month得到的是11月,就恢复正常顺序了
            }
        }
        return ans;  //别忘了要返回值
    }
public:
    int daysBetweenDates(string date1, string date2) {
        return abs(date_to_int(date2)-date_to_int(date1));  //因为题中没说谁先谁后,所以说用abs求绝对值
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值