// 年份确定,我们直接枚举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)