蓝桥杯备赛-日期问题专题

// 年份确定,我们直接枚举2023年的所有天,遍历数组中是否出现
// 时间复杂度为O(365 * 100),不会超时
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 1e5 + 50;
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	int ans = 0;
    int a[100] = {5, 6, 8, 6, 9, 1, 6, 1, 2, 4, 9, 1, 9, 8, 2, 3, 6, 4, 7, 7, 5, 9, 5, 0, 3, 8, 7, 5, 8, 1, 5, 8, 6, 1, 8, 3, 0, 3, 7, 9, 2,
7, 0, 5, 8, 8, 5, 7, 0, 9, 9, 1, 9, 4, 4, 6, 8, 6, 3, 3, 8, 5, 1, 6, 3, 4, 6, 7, 0, 7, 8, 2, 7, 6, 8, 9, 5, 6, 5, 6, 1, 4, 0, 1,
0, 0, 9, 4, 8, 0, 9, 1, 2, 8, 5, 0, 2, 5, 3, 3};
	int day[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
    for (int month = 1;month <= 12; month++) {
    	for (int d = 1;d <= day[month]; d++) {
    		// 记录当天的日期
    		int f[8] = {2,0,2,3,month/10,month%10,d/10,d%10}; 
    		int cnt = 0;
    		for (int i = 0;i < 100; i++) {
    			if (a[i] == f[cnt]) cnt++;
    			if (cnt == 8) {
    				ans++;
    				break;
    			}
    		}
    	}
    }
    cout << ans;
}

T3:完全日期(2021国赛)

解题思路:

直接暴力枚举从20010101~20211231,判断是否符合年份规范以及是否为完全数,时间复杂度o(2e5)可过该题

T4:合法日期:(2021省模拟)

水题不多说

T5:日期格式【2020省赛】

水题不多说

T6:特殊时间【2023省模拟】

解题思路:

枚举+剪枝,直接枚举会超时,月份和日最大为9.29为20,当sum(year) > 20时就可以跳过了

代码:

#include <bits/stdc++.h>
using namespace std;

using ll = long long;
int day[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
int getsum(int i) {
    int sum = 0;
    while (i) {
        sum += i % 10;
        i /= 10;
    }
    return sum;
}
int main() {
    ll ans = 0;
    // 年
    for (int y = 1900;y <= 9999; y++) {
        if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) day[2] = 29;
        int ans1 = getsum(y);
        if (ans1 > 30) continue;
        // 月
        for (int m = 1;m <= 12; m++) {
            // 日
            for (int d = 1; d <= day[m]; d++) {
                int ans2 = m/10 + m%10 + d/10 + d%10;
                if (ans1 == ans2) ans++;
            }
        }
        day[2] = 28; // 还原
    }
    cout << ans;
}

T7:日期问题【2017省赛】

解题思路:

直接暴力枚举19600101 ~ 20591231,先判断是不是合法日期,在判断是不是满足题目要求,这样枚举同时也满足了从小到大输出的要求,然后我发现用printf里的%02d真得很香,直接可以添加前导0。

注意!!!:

开始写的时候一直有一个样例没过,最后问题出现在判断日期合法性的地方,代码如下

bool check(int y,int m,int d) {
    if (m == 0 || m > 12) return false;
    if (m != 2 && (d == 0 || d > day[m])) return false;
    if (m == 2) {
        int leap = (y%4==0 && y%100) || (y % 400 == 0);
        if (d > 28 + leap) return false;
    }
    return true;
}

如果这样写,m = 2但是d = 0的情况就会被忽略!!!,前面完全日期也是挂在这里!!!!!

正确写法:

bool check(int y,int m,int d) {
    if (!m || m > 12 || !d) return false; // 这里!!!
    if (m != 2 && d > day[m]) return false;
    if (m == 2) {
        int leap = (y%4==0 && y%100) || (y % 400 == 0);
        if (d > 28 + leap) return false;
    }
    return true;
}

将判断月份的上下界,日的下界判断写到一起,日的下界判断需要分闰年和非闰年!!!

T8:回文日期【2020省模拟】

解题思路:

直接暴力枚举,和回文日期类似

代码:

#include <bits/stdc++.h>
using namespace std;
int days[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
bool check(int year,int month,int day) {
    if (!day || !month || month > 12) return false;
    if (month != 2 && day > days[month]) return false;
    if (month == 2) {
        int leap = (year % 4 == 0 && year % 100) || (year % 400 == 0);
        if (day > 28 + leap) return false;
    } 


### 最后

本人分享一下这次字节跳动、美团、头条等大厂的面试真题涉及到的知识点,以及我个人的学习方法、学习路线等,当然也整理了一些学习文档资料出来是给大家的。知识点涉及比较全面,包括但不限于**前端基础,HTML,CSS,JavaScript,Vue,ES6,HTTP,浏览器,算法等等**


![](https://upload-images.jianshu.io/upload_images/25340939-a76e7c4df8135b16.png?imageMogr2/auto-ori

**真题解析、进阶学习笔记、最新讲解视频、实战项目源码、学习路线大纲**
**详情关注公中号【编程进阶路】**

ent/strip%7CimageView2/2/w/1240)

**前端视频资料:**
TTP,浏览器,算法等等**


![](https://upload-images.jianshu.io/upload_images/25340939-a76e7c4df8135b16.png?imageMogr2/auto-ori

**真题解析、进阶学习笔记、最新讲解视频、实战项目源码、学习路线大纲**
**详情关注公中号【编程进阶路】**

ent/strip%7CimageView2/2/w/1240)

**前端视频资料:**
![](https://img-blog.csdnimg.cn/img_convert/90143103da124e0a443d9c3afe027cdd.webp?x-oss-process=image/format,png)
  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值