日期、时间问题整理

引言

日期、时间类的问题,在蓝桥杯中出现的概率貌似还挺高的。

这类问题如果自身码力不够且之前没接触过的话,有一定的翻车概率。

为避免自己在该问题上翻车,特此整理一下。

日期问题

对于日期问题,无论它怎么考,有个点肯定是少不了的,那就是判断闰年。虽然这判断的完成难度是语法课级别的,但由于条件容易忘记~~(也许这只是我菜的问题)~~所以我觉得这里还是有必要记录下,以防到时忘记翻车。

闰年判断

1
2
3
4
bool check (int year){
if(year%4 == 0 && year%100 || year%400==0 )return true;
return false;
}

除了闰年判断外,这个东西有玩头的莫过于给两个日期,然后问你在这两个日期间有多少符合题目给定的约束条件的、这两个日期间有多少天之类。如果是简单循环模拟的话,其实也不是辣么好写,可能存在一些边界情况。

有一个好的方法是:因为我们使用的日期基本可以认为是8位的。那么我们只需要枚举这日期和终点日期的年、月、日组成的8位数,对于枚举到的每个数,先判断它是否是一个日期,在判断是否是题目所求日期,就可以了。

日期转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
bool IsDate(int year,int month,int day){
if(month>12 || !month || !day)return false;
if(!month != 2 && days[month]<day )return false;
if(month == 2){
bool leap = year % 4==0 && year%100 || year %400 == 0;
if(28+leap<day)return false;
}
return true;
}
for(int date = Date1;date <= Date2; date++){
//提取年、月、日
int year = date / 10000;
int month = (date % 10000) / 100;
int day = date % 100;

if(IsDate(year,month,day)){
if(check(year,month,day)){//题目约束条件
一般是输出操作,也可能是其他操作。
}
}
}

举个例子,例如问:2020.9.1到2030.8.1有多少天?就可以把这两个日期转换成8位整数,套用上面的模板。然后搞一个变量放在第18行的位置计数就可以了。(值得注意的是,如果问的是天数,循环终止条件不是’≤’,而是’<’)

貌似日期问题玩的花样就辣么多吧,比较简单。下面是相关练习题链接

习题

acwing 1229.日期问题

acwing 466. 回文日期

时间问题

时间问题大题玩法跟日期问题类型,我们只要简单的把h和min化为seconds统一处理就好了。但因为各国的时区不同,出题人有可能会在这上面做文章,但有常识应该问题也不大,终归还是数学问题。

有意思的是,因为我们日常的时间表示方式的缘故,处理时间问题的难点可能出现在处理字符串上。

习题acwing 1231. 航班时间

就很好的诠释了这点,我个人觉得这题也是一道练习字符串处理的好题。

我写的题解链接如下:

acwing 1231.航班问题【题解】

小结

处理诸如日期、时间问题这种由多个不同层级单位组成的数字组合一个常用通用方法是统一单位,都先转化成最小单位。

按问题要求处理完后,再通过层级转换关系恢复原样。

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2020-2022 逸非安逸
  • Visitors: | Views:

请我喝杯咖啡吧~