蓝桥杯真题-回文日期(模拟 构造 2020 省赛)

前言:

本题主要涉及日期的模拟和对回文数的判断,下面会结合Java的特性给出解答。


题目如下:

蓝桥杯真题-回文日期(模拟 构造 2020 省赛)_第1张图片
蓝桥杯真题-回文日期(模拟 构造 2020 省赛)_第2张图片

Tips:

  • 首先解决模拟日期的问题:题目给的是一个整数来表示日期,这里我们不妨将日期拆分成年,月,日,然后将日(day)加一天,再进一步判断月和年是否需要进位。由于要判断回文数,想以13,92,82开头的日期显然是不合理的,因此对于闰年与一个月是否有31天一概不考虑,直接取满30天进入下一个月即可,最后再将年月日合并成一个整数。
  • 如何判断回文?由于使用的是java,字符串用起来会比较方便,因此将数字转换为字符串s1,截取从下标4开始的子串s2,再将s2翻转并判断s1是否以此开头。
  • 判断ABABBABA型回文串?这个也很简单,只需要再判断回文串的基础上进一步判断下标(0,2)与(1,3)上的字符是否相等。

Java AC代码:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int num = scanner.nextInt();
        int ans1 = 0, ans2 = 0;
        boolean flag = false;
        while (true) {
            num = runTime(num);
            if (!flag && judge(num)) {
                ans1 = num;
                flag = true;
            }
            if (judge(num) && judge2(num)) {
                ans2 = num;
                break;
            }
        }
        System.out.println(ans1);
        System.out.println(ans2);
        scanner.close();
    }
    public static boolean judge(int num) {
        String string = Integer.toString(num);
        StringBuffer stringBuffer = new StringBuffer(string.substring(4));
        if (string.startsWith(stringBuffer.reverse().toString())) {
            return true;
        }
        return false;
    }
    public static boolean judge2(int num) {
        String string = Integer.toString(num);
        if (string.charAt(0) == string.charAt(2) && string.charAt(1) == string.charAt(3)) {
            return true;
        }
        return false;
    }
    public static int runTime(int num) {
        int year = num/10000, month = (num/100)%100, day = num%100;
        day++;
        if(day > 31) {
            day = 1;
            month ++;
            if (month > 12) {
                month = 1;
                year++;
            }
        }
        return year*10000+month*100+day;
    }
}
  • 由于给定日期后面的回文日期可能有很多,因此加入了bool类型flag变量作标记,当求出第一个回文串的时候令flag=true,后面循环就不会再去修改第一次求出来的答案了,防止接下来求ABABBABA型回文串时,刚刚求的回文日期被覆盖掉。

时间&内存:

time&ram运行时间还可以,算是提交代码中比较快的了(ง •_•)ง

你可能感兴趣的:(算法碎碎念,java,算法,字符串,模拟)