题目:

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,保证 N 是一个合法日期的 8 位数表示。

输出描述
输出两行,每行 1 个八位数。第一行表示下一个回文日期,第二行表示下一个 ABABBABA 型的回文日期。

输入输出样例
示例

输入

20200202

输出

20211202
21211212

运行限制
最大运行时间:1s
最大运行内存: 256M

代码:

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
static int [] yue={0,31,29,31,30,31,30,31,31,30,31,30,31}; //存储每个月的天数闰年的话日期是92200229符合条件所以二月按照闰年算
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int N,qishi;
N=sc.nextInt(); //输入八位数字表示的日期
int c=1; //在输出时做判断用,使其只会输出一个普通类型的回文日期。
int a=N/10000; //取输入日期的年份
int d=a*10000+a%10*1000+a/10%10*100+a/100%10*10+a/1000; //算出该年份对应的回文日期排除特殊情况(思路里会说)
if (N<d){
qishi=a;
}else {
qishi=a+1;
} //判断是否为特殊情况确定起始年份
for (int i=qishi;i<=9999;i++){
String x=Integer.toString(i); //将年份转化为字符串
StringBuilder stringBuilder=new StringBuilder(x);
String y=stringBuilder.reverse().toString(); //将年份的字符串反转并存储,如2021反转为1202
int b=i%10*1000+i/10%10*100+i/100%10*10+i/1000; //利用年份算出日月存int类型做判断用
if (f(b)&&c==1){ //合法输出
System.out.println(x+y);
c--;
}
if (f(b)&&l(x)){ //合法且是特殊类型输出
System.out.println(x+y);
return;
}

}
sc.close();
}
public static boolean f(int b){ //判断求出的回文日期是否合法
if (b/100>12||b%100>yue[b/100]){
return false;
}
return true;
}
public static boolean l(String x){ //判断是否为ABABBABA型回文日期
if (x.charAt(0)==x.charAt(2)&&x.charAt(1)==x.charAt(3)){
return true;
}
return false;
}
}

思路:

首先说明一下特殊情况,用例中会有20200101这种比年份对应的回文日期小,所以输出时答案应是两个20200202。如果直接从2021年开始算就会出错,所以我们要进行判断从2020年开始向后计算。

代码是直接由年份算出回文日期,所以算出的日期一定是回文,所以不用再进行回文判断,只用判断日期是否合法即可。

注意:本题中说的是10000101≤N≤89991231,并不是日期最大只算到89991231(这个日期是用例中输入的最大的日期)本题进行计算时最大应该是99999999(最大八位数)。一开始写一直有个用例过不去(就是这个89991231)算是比较坑的一点(也是我没认真读题)。