按照年份计算十全时的个数

时间:2024-01-23 12:39:13

题目:
假如电子计时器所显示的十个数字是“1115093028”这样一串数,它表示的数是11月15日9时30分28秒.
在这串数中,“0”出现了2次,“1”出现了三次,“2”、“3”、“5”、“8”、“9”各出现了一次,
而“4”、“6”、“7”没有出现.如果在电子计时器所显示的这串数里,0,1,2,3,4,5,6,7,8,9这
十个数字都只出现一次,称它所表示的时刻为“十全时”,那么2003年一共有__个这样的“十全时”.
注:按24小时制记时

分析过程:
1.按照上题所说,‘十全时’的数一共十位,十位中要有 0,1,2,3,4,5,6,7,8,9这十个数,也可以说成十位每位都不一样(ps:因为阿拉伯数字一共也就只有十个单位数);
2.题目所说的2003年不免让人想到是不是需要判断是否是闰年。然后一想,闰年和非闰年的区别就是2月份是不是有29号,但是不论是不是有29号,2月的2数和29号肯
定是重复了,不可能是‘十全时’数。所以这里不去考虑是否是闰年的问题
3.题目所述的‘月’、‘日’、‘时’、‘分’、‘秒’。只有日的数字范围不是固定的,是根据月份确定的。而其他的都是固定的。

分析结果:
根据我们的分析首先可以确定要使用什么来筛选这个‘十全时’数。因为它的每位不相同,所以使用Set集合来筛选,这样就可以确定,只有当set集合的长度是10的时候,
这个数才是‘十全时’数。
然后我们要计算日的数字范围,那么我们可以定义一个数组,里面存入十二个月每个月对应的天数,根据月份来取对应的日的数字。
分析到这里,代码就可以开始写了。
下面贴上我实现的完整代码(仅供参考)

public static void main(String[] args) {

    Scanner scanner = new Scanner(System.in);

    System.out.println("请输入年份:");
    String year = scanner.next();

    System.out.println("开始统计 [" + year +"] 年的十全时个数!");
    int[] mouths = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

    int count = 0;
    Set<Character> timeSet = null;
    Character[] timeSetArray = new Character[10];
    char[] mouthStr = {};
    for (int mouth = 1; mouth <= 12; mouth ++) {  //遍历月
        int i = 0;
        mouthStr = String.valueOf(mouth).toCharArray();
        timeSetArray[0]=mouthStr[0];
        if (mouthStr.length == 1) {
            timeSetArray[1]='0';
        } else {
            timeSetArray[1]=mouthStr[1];
        }
        for (int day = 1; day <= mouths[mouth - 1]; day ++) {   //按月遍历日
            mouthStr = String.valueOf(day).toCharArray();
            timeSetArray[2]=mouthStr[0];
            if (mouthStr.length == 1) {
                timeSetArray[3]='0';
            } else {
                timeSetArray[3]=mouthStr[1];
            }
            for (int hour = 0; hour <= 23; hour ++) {   //遍历小时
                mouthStr = String.valueOf(hour).toCharArray();
                timeSetArray[4]=mouthStr[0];
                if (mouthStr.length == 1) {
                    timeSetArray[5]='0';
                } else {
                    timeSetArray[5]=mouthStr[1];
                }
                for (int min = 0; min <= 59; min ++) {   //遍历分钟
                    mouthStr = String.valueOf(min).toCharArray();
                    timeSetArray[6]=mouthStr[0];
                    if (mouthStr.length == 1) {
                        timeSetArray[7]='0';
                    } else {
                        timeSetArray[7]=mouthStr[1];
                    }
                    for (int second = 0; second <= 59; second ++) {   //遍历秒
                        mouthStr = String.valueOf(second).toCharArray();
                        timeSetArray[8]=mouthStr[0];
                        if (mouthStr.length == 1) {
                            timeSetArray[9]='0';
                        } else {
                            timeSetArray[9]=mouthStr[1];
                        }

                        timeSet = new HashSet<Character>(Arrays.asList(timeSetArray));

                        if (timeSet.size() == 10) {
                            count ++;
                        }
                    }
                }
            }
        }
    }
    System.out.println("[" + year +"] 年的十全时个数为 " + count);
}

如有不对之处,可以评论联系博主!