蓝桥回文日期

在这里插入图片描述
示例
输入

20200202

输出

20211202
21211212

在java中有一个类是LocalDate
LocalDate 是 Java8中新增的日期类,采用了系统的默认时区。可以方便的处理 日期对象 的 年、月、日 信息。有这个类在解决日期类问题比较方便。
下面常用的几个常用API

1.创建日期对象
 获取当前日期对象
LocalDate.now() : 返回默认时区下的、系统始终下的 当前日期
2.获取日期对象的 年、月、日 信息
getYear() : 获取年分信息
getMonth() : 获取月份信息(枚举类型)
getMonthValue() : 获取月份的数字(数值类型)
getDayOfMonth() : 获取日期信息
getDayOfWeek() : 获取星期几 (枚举类型)
getDayOfYear() : 获取这一年的第几天
 3.指定 日期对象的属性
withYear(int) : 设置年
withMonth(int) : 设置月
withDayOfMonth(int) : 设置日
withDayOfYear(int) : 设置这一年的第几天
 with(TemporalAdjuster) : 时间调整器,更方便的调整
 
 4.加上 或者 减去 年、月、日、周
plusYears(long) : 加几年
plusMonths(long) : 加几个月
plusDays(long) : 加几天
plusWeeks(long) : 加几个星期
minusYears(long) : 减几年
minusMonths(long) : 减几个月
minusDays(long) : 减几天
minusWeeks(long) : 减几个星期
import java.time.LocalDate;
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    
    


    public static void main(String[] args) {
    
    
        Scanner scanner=new Scanner(System.in);
        String N = scanner.next();
        //System.out.println(N);
        int year=Integer.parseInt(N.substring(0,4));
        int month=Integer.parseInt(N.substring(4,6));
        int day = Integer.parseInt(N.substring(6, 8));
        LocalDate date = LocalDate.now();//通过LocalDate这个类实现日期操作
        //修改当前年月日
        date=date.withYear(year);
        date=date.withMonth(month);
        date=date.withDayOfMonth(day);
        //2020-02-02
        //System.out.println(date);
        //分割成20200202

        //System.out.println(s);
        String a="";//第一个回文日期
        String b="";//第二个ABABBABA型回文日期
        boolean isFind=false;
        while(true){
    
    
            //一直往后找
            date=date.plusDays(1);
            String s= date.toString().replace("-","");
            if(isHuiWen(s)){
    
    
                //说明是回文数
                if(!isFind){
    
    
                    a=s;
                    isFind=true;
                }
                if(isABABBABA(s)){
    
    
                    //说明是ABABBABA类型的
                  b=s;
                  break;
                }
            }

        }
        System.out.println(a);
        System.out.println(b);
        scanner.close();

    }

    private static boolean isABABBABA(String s) {
    
    
        //判断ABABBABA
        if(s.charAt(0)==s.charAt(7)&&s.charAt(1)==s.charAt(6)&&s.charAt(2)==s.charAt(5)
        &&s.charAt(3)==s.charAt(4)&&s.charAt(0)==s.charAt(2)&&s.charAt(1)==s.charAt(3)
        )
        {
    
    
            return true;
        }

        return false;
    }

    private static boolean isHuiWen(String s) {
    
    

       int mid=s.length()/2;
       int r=s.length()-1;
//        System.out.println("mid"+mid);
//        System.out.println("r"+r);
//        System.out.println("进来isHuiWen"+s);
        for(int i=0;i<mid;i++){
    
    
//            System.out.println("s.charAt(i)"+s.charAt(i));
//            System.out.println("s.charAt(r)"+s.charAt(r));
            if(s.charAt(i)!=s.charAt(r)){
    
    
                return false;
            }
            r--;
        }
        return true;
    }


}

不使用LocalDate类的另一种方法
1.首先要满足回文的形式,即ABCDDCBA,对于回文的判断用数组会方便许多。

2.ABABBABA型:此处也可以使用数组判断是否是回文型。

3.要满足日期的格式。

暴力求解思路:预先存储好各个月份的天数。需要三个判断方法:

a.判断是否是闰年,如果是,则将存储的二月份的天数改为29

b.判断是否是回文型

c.判断是否是ABAB型

通过三重for循环来寻找下一次回文日期。巧妙运用for循环的执行顺序就可以实现从当前日期往后开始寻找。先增加天数,天数满了增加月份,月份也满了增加年份。要注意增加月份和年份时对应地要初始化天数和月份。通过两个Boolean值来判断是否找到我们的目标日期,当两个Boolean值都为true时说明都找到了我们的目标日期,可以退出循环了。

import java.util.*;
class Main{
    
    
    static boolean IsRun(int y) {
    
    
        if(y%400==0||(y%4==0&&y%100!=0)) return true;
        return false;
    }
    static boolean ABBA(String Str){
    
    //判断回文日期
        char []str=Str.toCharArray();
        if(str[0]==str[7]&&str[1]==str[6]&&str[2]==str[5]&&str[3]==str[4]) return true;
        return false;
    }
    static boolean ABAB(String Str) {
    
    //判断ABBA型
        char []str=Str.toCharArray();
        if(str[0]==str[2]&&str[2]==str[5]&&str[5]==str[7]&&str[1]==str[3]&&str[3]==str[4]&&str[4]==str[6]&&str[0]!=str[1]) 
            return true;
        return false;
    }
    public static void main(String args[]) {
    
    
        int monthes[]={
    
    0,31,28,31,30,31,30,31,31,30,31,30,31};
        Scanner in=new Scanner(System.in);
        String time=in.next();
        Integer tt=Integer.parseInt(time);
        int year=tt/10000;
        int month=tt%10000/100;
        int day=tt%100+1;
        int n;
        int []ans=new int[2];
        boolean flag1=false,flag2=false;
        if(IsRun(year)) monthes[2]=29;
        for(int i=year;i<=9999;i++,month=1,day=1) {
    
    //巧妙运用for循环的顺序,可以实现从当前日期开始往后寻找
            for(int j=month;j<=12;j++,day=1) {
    
    
                for(int k=day;k<=monthes[j];k++) {
    
    
                    n=i*10000+j*100+k;
 
                    String Str=String.valueOf(n);
                    if(ABBA(Str)&&flag1==false) {
    
    
                        String str1=Str;
                        flag1=true;
                        ans[0]=n;
                    }
                    if(ABAB(Str)&&flag2==false) {
    
    
                        String str2=Str;
                        flag2=true;
                        ans[1]=n;
                    }
                    if(flag1==true&&flag2==true) break;
                }
            }
        }
        System.out.println(ans[0]);
        System.out.println(ans[1]);
    }
}

猜你喜欢

转载自blog.csdn.net/ChenYiRan123456/article/details/129706885