示例
输入
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]);
}
}