【每日一题】蓝桥杯历届真题--回文日期

在这里插入图片描述

解题思路:这道题如果按日期一天一天加,然后判断符不符合条件,这种暴力法最后只能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;
			}
		}

	}

}

修改代码时,在判断是否需要从当年还是下一年的问题思考了挺久,脑子非常混乱,一直克制让自己冷静慢慢一步一步思考,越急判断条件就越容易写错。

猜你喜欢

转载自blog.csdn.net/adminguojieBin/article/details/123432240
今日推荐