题目描述
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≤8999123110000101 \leq N \leq 89991231
10000101≤N≤89991231,保证 N 是一个合法日期的 8 位数表示。
输出描述
输出两行,每行 1 个八位数。第一行表示下一个回文日期,第二行表示下一个 ABABBABA 型的回文日期。
输入输出样例
示例
输入
20200202
输出
20211202
21211212
代码实现
import java.util.*;
import java.text.SimpleDateFormat;
//回文日期
//思路:截取用户输入的年份,把年份倒多来再拼接上去形成年月日,再来判断日期是否合法 和 是否符合ABAB型
public class Main{
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
String num = Integer.toString(n);
//
boolean condition1 = false, condition2 = false;
// 循环一次加一年
for (int i = n; !condition1 || !condition2; i += 10000) {
String date = Integer.toString(i);
// 截取年份字符串也就是前半部分,再做反转接在后面形成回文
StringBuffer sb = new StringBuffer(date.substring(0, 4));
String sb2 = sb.reverse().toString();
String string = sb.reverse().toString().concat(sb2);
// 判断回文是否合法
if (!condition1 && isDate(string) && string.compareTo(num) > 0) {
System.out.println(string);
condition1 = true;
}
// 加上一个判断是否ABAB型
if (!condition2 && isDate(string) && string.compareTo(num) > 0 && string.substring(0, 2).equals(string.substring(2, 4))) {
System.out.println(string);
condition2 = true;
}
}
scan.close();
}
// 判断是否合法日期
public static boolean isDate(String date) {
String dt = date.substring(0, 4) + "-" + date.substring(4, 6) + "-" + date.substring(6, 8);
// 日期格式化
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
// 设为false能严格验证日期
sdf.setLenient(false);
// 解析生成日期 不合法就抛出异常
sdf.parse(dt);
} catch (Exception e) {
return false;
}
return true;
}
}