2021寒假每日一题《回文日期》

回文日期

题目来源:第十一届蓝桥杯省赛第二场C++A/B组
时间限制:\(1000ms\) 内存限制:\(256mb\)

题目描述

2020 年春节期间,有一个特殊的日期引起了大家的注意:\(2020 年 2 月 2 日\)
因为如果将这个日期按 yyyymmdd 的格式写成一个 8 位数是 20200202,恰好是一个回文数。
我们称这样的日期是回文日期。
有人表示 20200202 是“千年一遇” 的特殊日子。
对此小明很不认同,因为不到 2 年之后就是下一个回文日期:20211202\(2021 年 12 月 2 日\)
也有人表示 20200202 并不仅仅是一个回文日期,还是一个 ABABBABA 型的回文日期。
对此小明也不认同,因为大约 100 年后就能遇到下一个 ABABBABA 型的回文日期:21211212\(2121 年 12 月 12 日\)
算不上“千年一遇”,顶多算“千年两遇”。
给定一个 8 位数的日期,请你计算该日期之后下一个回文日期和下一个 ABABBABA 型的回文日期各是哪一天。

输入格式

输入包含一个八位整数 \(N\),表示日期。

输出格式

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

数据范围

对于所有评测用例,\(10000101≤N≤89991231\) ,保证 N 是一个合法日期的 8 位数表示。

样例输入

20200202

样例输出

20211202
21211212

解题思路

需要给出输入日期的 下一个回文日期下一个 ABABBABA 型的日期
所以从输入的数开始,每次循环+1。
date 表示输入的数。
输出的第一个数,需要判断 date 是否为合法日期和回文数。
输出的第二个数,除了需要上面的判断外,还需要判断是否为 ABABBABA 型的数。

一、判断是否为合法日期

判断一个数是否为合法日期,只需要看月份和天数是否能够合法,比如:
1、3、5、7、8、10、12月,有31天;
4、6、9、11月,有30天;
2月 需要单独进行判断,如果年份为 闰年 ,2月有29天,否则2月只有28天。

二、判断是否为回文数

将数字转化为字符串,定义两个指针,分别在左端和右端。
判断左右两端的字符是否一样,如果一样则左右指针都向内移动一位,依次进行判断。
只要有一位不相同,就可以直接返回 false
两个指针相遇的时候,代表字符串内的全部字符已经比较完毕,没有需要不相同的,返回 true

三、判断 ABABBABA 型数

只需判断字符串的第 \(0,2,5,7\) 位是否相同,和字符串的第 \(1,3,4,6\) 位是否相同,且第 \(0,1\) 位不相同。

结束程序在输出两个数之后,可以使用两个 boolean 型的变量存放输出的状态,两个数都输出之后结束循环。

解题代码-Java

import java.util.Scanner;

public class Main {
    static boolean check(int n) {
        String s = Integer.toString(n);
        int l = 0, r = s.length() - 1;
        while (l < r) {
            if (s.charAt(l) != s.charAt(r)) {
                return false;
            }
            l++;
            r--;
        }
        return true;
    }

    static boolean checkDate(int n) {
        String s = Integer.toString(n);
        int year = Integer.parseInt(s.substring(0, 4));
        int month = Integer.parseInt(s.substring(4, 6));
        int day = Integer.parseInt(s.substring(6, 8));
        if (month <= 0 || month > 12) {
            return false;
        }
        if (day <= 0) {
            return false;
        }
        switch (month) {
            case 2:
                if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
                    if (day > 29) {
                        return false;
                    }
                } else {
                    if (day > 28) {
                        return false;
                    }
                }
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                if (day > 30) {
                    return false;
                }
                break;
            default:
                if (day > 31) {
                    return false;
                }
                break;
        }
        return true;
    }

    static boolean checkABABBABA(int n) {
        char[] s = Integer.toString(n).toCharArray();
        return s[0] == s[2] && s[0] == s[5] && s[0] == s[7] && s[1] == s[3] && s[1] == s[4] && s[1] == s[6] && s[0] != s[1];
    }

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int date = input.nextInt() + 1;
        input.close();
        boolean flag1 = false, flag2 = false;
        while (!flag1 || !flag2) {
            if (!check(date)) {
                date++;
            } else if (!checkDate(date)) {
                date++;
            } else if (!flag1) {
                System.out.println(date);
                flag1 = true;
            } else if (!checkABABBABA(date)) {
                date++;
            } else if (!flag2) {
                System.out.println(date);
                flag2 = true;
            }
        }
    }
}
posted @ 2021-03-04 15:35  胡人天  阅读(1002)  评论(0编辑  收藏  举报