zoukankan      html  css  js  c++  java
  • 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;
                }
            }
        }
    }
    
  • 相关阅读:
    eclipse里面自动添加get和set方法
    初探内联方式的 onload="doSomething()"为何要加"()"?而js代码的 onload="doSomething" 和 addEventListener 为何不加"()"?
    ubuntu下安装git,sublime,nodejs
    ajax学习计划
    ajax学习笔记
    滑动窗口思路精髓总结
    Java给定一个字符串,分割字符串使得每个子字符串都是回文串,求最少分割次数
    顺时针打印
    戳气球最少需要几下一样的题
    ip覆盖算法
  • 原文地址:https://www.cnblogs.com/hurentian/p/14480601.html
Copyright © 2011-2022 走看看