完美对称日
看到朋友圈有人发这个,今天是2021年12月02好,说是完美对称日,千年一遇。说到“千年一遇”我就不太相信,想写个代码验证一下。
结果
但从2000年来看,完美对称日还是挺多的,起码去年就有一次(20200202)。
2000年的就有这么多,不算千年一遇了:
20011002
20100102
20111102
20200202
20211202
20300302
20400402
20500502
20600602
20700702
20800802
20900902
21011012
21100112
21111112
21200212
21211212
21300312
21400412
21500512
21600612
21700712
21800812
21900912
22011022
22100122
22111122
22200222
22211222
22300322
22400422
22500522
22600622
22700722
22800822
22900922
代码
import java.util.*;
import java.util.concurrent.ConcurrentSkipListSet;
import java.util.concurrent.CountDownLatch;
/**
* 完全对称日期
*/
public class PerfectDay {
static ConcurrentSkipListSet<String> perfectDay =
new ConcurrentSkipListSet<String>();
public static void main(String[] args)
throws InterruptedException {
int startYear = 1000;
int endYear = 9999;
int count = endYear - startYear + 1;
CountDownLatch countDownLatch = new CountDownLatch(count);
for (int year = startYear; year <= endYear; year++) {
int finalYear = year;
new Thread() {
@Override
public void run() {
List<String> days = getDays(finalYear);
for (String day : days) {
if (isPerfectDate(day)) {
perfectDay.add(day);
}
}
countDownLatch.countDown();
}
}.start();
}
countDownLatch.await();
for (String s : perfectDay) {
System.out.println(s);
}
}
/**
* 获取该年下的每一天
*
* @param yearParam 年
* @return 形如yyyymmdd的数组
*/
public static List<String> getDays(int yearParam) {
List<String> list = new ArrayList();
Calendar aCalendar = Calendar.getInstance(Locale.CHINA);
StringBuilder dateSB = new StringBuilder(
""+yearParam
);
for (int monthParam = 1; monthParam <= 12; monthParam++) {
dateSB.append(monthParam > 9 ? monthParam : "0" + monthParam);
aCalendar.set(yearParam, monthParam, 1);
// 年份
int year = aCalendar.get(Calendar.YEAR);
// 月份
int month = aCalendar.get(Calendar.MONTH) + 1;
// 天数
int day = aCalendar.getActualMaximum(Calendar.DATE);
// 添加每一天
for (int i = 1; i <= day; i++) {
dateSB.append(i > 9 ? i : "0" + i);
list.add(dateSB.toString());
dateSB.delete(6, dateSB.length());
}
dateSB.delete(4, dateSB.length());
}
return list;
}
/**
* 是不是完美的一天
*
* @param dateStr
* @return
*/
public static boolean isPerfectDate(String dateStr) {
char[] chars = dateStr.toCharArray();
int length = chars.length;
int loopTime = length / 2;
int i = 0;
for (i = 0; i < loopTime; i++) {
if (chars[i] != chars[length - 1 - i]) {
break;
}
}
if (i >= loopTime) {
return true;
}
return false;
}
}