⭐️前面的话⭐️
本篇文章介绍来蓝桥杯真题之回文日期的题解,展示语言java。
📒博客主页:未见花闻的博客主页
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
📌本文由未见花闻原创,CSDN首发!
📆首发时间:🌴2023年1月10日🌴
✉️坚持和努力一定能换来诗与远方!
💭推荐书籍:📚《算法》,📚《算法导论》
💬参考在线编程网站:🌐牛客网🌐力扣
博主的码云gitee,平常博主写的程序代码都在里面。
博主的github,平常博主写的程序代码都在里面。
🍭作者水平很有限,如果发现错误,一定要及时告知作者哦!感谢感谢!
📌导航小助手📌
- ⭐️2020省赛真题之回文日期⭐️
- 🔐题目详情
- 💡解题思路
- 🔑源代码
- 🌱总结
⭐️2020省赛真题之回文日期⭐️
🔐题目详情
2020 年春节期间,有一个特殊的日期引起了大家的注意:2020 年 2 月 2 日。因为如果将这个日期按 “yyyymmdd” 的格式写成一个 8 位数是 20200202,恰好是一个回文数。我们称这样的日期是回文日期。
有人表示 20200202 是 “千年一遇” 的特殊日子。对此小明很不认同,因为不到 2 年之后就是下一个回文日期:20211202 即 2021 年 12 月 2 日。
也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA 型的回文日期:21211212 即 2121 年 12 月 12 日。算不上 “千年一遇”,顶多算 “千年两遇”。
给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。
输入描述
输入包含一个八位整数 N,表示日期。
对于所有评测用例, 10000101 ≤ N ≤ 89991231 10000101 \leq N \leq 89991231 10000101≤N≤89991231,保证 N 是一个合法日期的 8 位数表示。
输出描述
输出两行,每行 1 个八位数。第一行表示下一个回文日期,第二行表示下一个 ABABBABA 型的回文日期。
输入输出样例
示例
输入
20200202
输出
20211202
21211212
运行限制
最大运行时间:1s
最大运行内存: 256M
💡解题思路
将日期年月日与题目所给 8 8 8位字符串进行互相转换,日期模拟日期变化,格式化字符串用来判断回文,注意,该题判断回文有两种,一种是直接的回文判断,另外一种是判断 A B A B B A B A ABABBABA ABABBABA型的回文字符串,均可以使用双指针模拟实现。
解题思路很简单,一直将日期按照天模拟递推,然后判断是否是满足题意的回文串,满足则输出即可,找到两个满足题意的回文串就可以了。
🔑源代码
java
import java.util.Scanner;
import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
private static int[] mToD = new int[]{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
//判断闰年
private static boolean isOk(int y) {
return (y % 4 == 0 && y % 100 != 0) || (y % 400 == 0);
}
//格式化字符串转换成int年月日
private static int[] transDate(String s) {
int[] res = new int[3];
char[] cs = s.toCharArray();
res[0] = (cs[0] - '0') * 1000 + (cs[1] - '0') * 100 + (cs[2]- '0') * 10 + (cs[3] - '0');
res[1] = (cs[4] - '0') * 10 + (cs[5] - '0');
res[2] = (cs[6] - '0') * 10 + (cs[7] - '0');
return res;
}
//判断下一个回文
private static boolean isPd(String s) {
char[] cs = s.toCharArray();
int l = 0;
int r = cs.length - 1;
//char a = cs[0];
//char b = cs[1];
while (l < r) {
//char t = b;
//if (l == 0 || l == 2) t = a;
if (cs[l] != cs[r]) return false;
l++;
r--;
}
return true;
}
//判断ABABBABA 型的回文日期
private static boolean isPdPlus(String s) {
char[] cs = s.toCharArray();
int l = 0;
int r = cs.length - 1;
char a = cs[0];
char b = cs[1];
while (l < r) {
char t = b;
if (l == 0 || l == 2) t = a;
if (cs[l] != cs[r] || cs[l] != t) return false;
l++;
r--;
}
return true;
}
//格式化日期
private static String transString(int[] date) {
StringBuilder sb = new StringBuilder();
String ts = "0000" + date[0];
sb.append(ts.substring(ts.length() - 4, ts.length()));
ts = "0" + date[1];
sb.append(ts.substring(ts.length() - 2, ts.length()));
ts = "0" + date[2];
sb.append(ts.substring(ts.length() - 2, ts.length()));
return sb.toString();
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
String s = scan.nextLine();
int[] date = transDate(s);
//模拟
//是否是初始日期
boolean first = true;
//第一个回文是否找到
boolean hasAns1 = false;
//第二个ABABBABA回文串是否找到
boolean hasAns2 = false;
int cnt = 0;
while (cnt < 2) {
if (isOk(date[0])) mToD[2] = 29;
else mToD[2] = 28;
if (date[2] >= mToD[date[1]]) {
date[2] = 1;
date[1]++;
if (date[1] == 13) {
date[1] = 1;
date[0]++;
}
} else {
date[2]++;
}
//System.out.println(Arrays.toString(date));
if (!first && !hasAns1 && isPd(transString(date))) {
System.out.println(transString(date));
hasAns1 = true;
cnt++;
}
if (!first && !hasAns2 && isPdPlus(transString(date))) {
System.out.println(transString(date));
hasAns2 = true;
cnt++;
}
first = false;
}
scan.close();
}
}
🌱总结
一道不难但麻烦的模拟题。