> 文章列表 > 蓝桥回文日期

蓝桥回文日期

蓝桥回文日期

蓝桥回文日期
示例
输入

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) {//判断ABABBABAif(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]);}
}