解题思路:这道题如果按日期一天一天加,然后判断符不符合条件,这种暴力法最后只能80%,且注意要判断日期是否合法(例如31311313,月份没有13月,日期还要判断每个月是30日还是31日,2月是28还是29)。这道题其实只要累加年份就可以了,年份累加后,将年份字符串反转 形成 月份日期(就符合回文条件),然后判断月份日期是否合法即可。还有一个要注意的是,判断输入的年份日期,若当前日期已经过了 当前年份的回文 日期,则直接判断下一年,否则要从当年判断(例如20200101、20200203)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
static int[] date1 = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };// 非闰年每月的天数
static int[] date2 = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };// 闰年每月的天数
public static boolean isOk(String y, String s) {// y是年份的字符串,s是月份和日的字符串
String s1 = s.substring(0, 2);// 分割出月份
String s2 = s.substring(2);// 分割出 第几天
int year = Integer.valueOf(y);
int month = Integer.valueOf(s1);
int date = Integer.valueOf(s2);
if (month > 12 || month < 1)// 非法的月份
return false;
int d;// 当月的天数
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {// 判断是否闰年
d = date2[month - 1];
} else {
d = date1[month - 1];
}
if (date < 1 || date > d)// 判断天数是否非法
return false;
return true;
}
public static void main(String[] args) throws IOException {
String s = in.readLine();
int begin = Integer.parseInt(s.substring(0, 4));// 分割出年份
int md = Integer.parseInt(s.substring(4));// 分割月份和日期
StringBuffer sb = new StringBuffer(s.substring(0, 4));
String y = sb.reverse().toString();// 获取反转的年份
int m1 = Integer.parseInt(y.substring(0, 2));// 反转年份 对应的月
int d1 = Integer.parseInt(y.substring(2));// 反转年份 对应的日
int m2 = md / 100, d2 = md % 100;// 月份和日
// 判断 反转年份 对应月份(第3、4位) 是否小于 当前的月份(5、6位) 是的话直接比较下一年 例如20200301
// 02和03对比,时间过了,后面的日期都不符合条件,直接下一年
// 或者 反转年份对应月份和当前月份相等,那就要比较日期,日期过了就直接比下一年,没有就比当前年份。例如20200201
// 02和02相等,02大于01,日期还没过,所以符合条件的下一个年份就是当前年。
if (m1 < m2 || (m1 == m2 && d1 <= d2)) {
begin += 1;
}
boolean flag1 = true, flag2 = true;// flag1、flag2用于判断是否已经输出
for (int i = begin; i <= 9090; i++) {// 符合条件ABAB的4位数的最大年份就是9090
String s1 = String.valueOf(i);// 年份
StringBuilder sb2 = new StringBuilder(s1);
String s2 = sb2.reverse().toString();// 反转就是月份和日期
if (!isOk(s1, s2)) {// 判断月份日期是否合法
continue;
}
if (flag1) {// 符合回文日期条件
System.out.println(s1 + s2);
flag1 = false;
}
if (flag2 && s1.charAt(0) != s1.charAt(1) && s1.charAt(0) == s1.charAt(2) && s1.charAt(1) == s1.charAt(3)) {// 符合回文日期条件且是ABABBABA型
System.out.println(s1 + s2);
flag2 = false;
}
if (!flag1 && !flag2) {// 两个都输出后,结束遍历
break;
}
}
}
}
修改代码时,在判断是否需要从当年还是下一年的问题思考了挺久,脑子非常混乱,一直克制让自己冷静慢慢一步一步思考,越急判断条件就越容易写错。