import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner=new Scanner(System.in);
int month[]= {0,31,28,31,30,31,30,31,31,30,31,30,31};
int a=scanner.nextInt();
int b=scanner.nextInt();
int year1=a/10000;
int month1=a/100%100;
int day1=a%100;
int year2=b/10000;
int month2=b/100%100;
int day2=b%100;
int count=0;
for (int year = year1; year <= year2; year++) {
if(leap(year)) {
month[2]=29;
}else {
month[2]=28;
}
for (int m = 1; m <= 12; m++) {
if(year==year1&&m<month1) {
continue;
}
for (int day = 1; day <= month[m]; day++) {
if(year==year1&&m==month1&&day<day1) {
continue;
}
if(year==year2&&m==month2&&day>day2) {
return;
}
String string="";
if(m<10) {
string=year+""+"0"+m;
if(day<10) {
string+="0"+day;
}else {
string+=day;
}
}else {
string=year+""+m;
if(day<10) {
string+="0"+day;
}else {
string+=day;
}
}
if(huiwen(string)) {
count++;
}
}
}
}
System.out.println(count);
}
public static boolean leap(int year) {
if(year%400==0||(year%4==0&&year%100!=0)) {
return true;
}
return false;
}
public static boolean huiwen(String string) {
// 直接使用字符串翻转判断是否是相同的,以此来判断是否是回文
StringBuilder sBuilder=new StringBuilder(string);
// 注意下面的StringBuilder用法存在问题,因为直接使用sBuilder翻转,会把反转后的对象也赋值给sBuilder2,
// 也就是说,这两个完全就是同一个
// StringBuilder sBuilder2=sBuilder.reverse();
if(sBuilder.reverse().toString().equals(string)) {
return true;
}
return false;
}
}
这道题可以直接模拟每一个日期,然后针对每一个日期进行判断是否为回文日期,首先,我们需要根据输入的两个日期获取到对应的年月日,为后面遍历做准备,然后,开始遍历,在遍历年份的时候需要判断是否为闰年,如果是闰年,就把2月份的日期设置为29天,反之,就设置为28天。接下来遍历月和日,这里需要注意要把不符合条件的日期给排除。我在做的时候,日的结束范围那里多加了一个等号,直接少过三个测试点。
在判断是否为回文日期那里,我是采用StringBuilder翻转toString后与原来的string做判断,这样写会快一些,但是我一开始写错了,我并没有意识到直接把sBuilder.reverse()赋值给sBuilder2其实是把对象赋给它了,也就是这两个指向的是同一个东西,那么内容肯定也是一样的。



京公网安备 11010502036488号