完美对称日真的是千年一遇吗?20211202 写个Java代码验证下

完美对称日

看到朋友圈有人发这个,今天是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;
    }

}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值