蓝桥杯试题 历届真题 日期问题【第八届】【java省赛】

问题描述
小明正在整理一批历史文献。这些历史文献中出现了很多日期。

小明知道这些日期都在 1960 年 1 月 1 日 至 2059 年 12 月 31 日。

令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。

更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。

比如 02/03/04,可能是 2002 年 03 月 04 日、2004 年 02 月 03 日 或 2004 年 03 月 02 日。

给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?

输入格式
一个日期,格式是 AA/BB/CC。 (0 ≤ A, B, C ≤ 9)

输出格式
输出若干个不相同的日期,每个日期一行,格式是 yyyy-MM-dd,多个日期按从早到晚排列。

样例输入
02/03/04

样例输出
2002-03-04
2004-02-03
2004-03-02
 


import sun.reflect.generics.tree.Tree;

/**
 * 问题描述
 * 小明正在整理一批历史文献。这些历史文献中出现了很多日期。
 *
 * 小明知道这些日期都在 1960 年 1 月 1 日 至 2059 年 12 月 31 日。
 *
 * 令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。
 *
 * 更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。
 *
 *
 *
 * 给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗?
 *
 * 输入格式
 * 一个日期,格式是 AA/BB/CC。 (0 ≤ A, B, C ≤ 9)
 *
 * 输出格式
 * 输出若干个不相同的日期,每个日期一行,格式是 yyyy-MM-dd,多个日期按从早到晚排列。
 *
 * 样例输入
 * 02/03/04
 *
 * 样例输出
 * 2002-03-04
 * 2004-02-03
 * 2004-03-02
 */
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();

        //将String型数据变为int,- '0' 即可
        int year = (s.charAt(0) - '0') * 10 + (s.charAt(1) - '0');
        int month = (s.charAt(3) - '0') * 10 + (s.charAt(4) - '0');
        int day = (s.charAt(6) - '0') * 10 + (s.charAt(7) - '0');

        // 有采用年/月/日的,有采用月/日/年的,还有采用日/月/年
        String case1 = f(year,month,day);
        String case2 = f(day,year,month);
        String case3 = f(day,month,year);

        //加入TreeSet实现自动排序
        Set set = new TreeSet();
        if(case1 != "") set.add(case1);
        if(case2 != "") set.add(case2);
        if(case3 != "") set.add(case3);

        for(String riqi : set){
            System.out.println(riqi);
        }
    }
    
    //处理日期
    static String f(int year,int month,int day){
        //1960 年 1 月 1 日 至 2059 年 12 月 31 日。
        //判定日期是否合法
        if(year >= 60 && year <= 99){
            year += 1900;
        }else if(year <= 59 && year >= 0){
            year += 2000;
        }else {
            return "";
        }
        //判断月份是否合法
        if(month > 12 || month < 1){
            return "";
        }
        //判断天数是否合法
        if(day < 1 || day > 31){
            return "";
        }
        //判断月是否合法
        switch (month){
            //判断是否满足闰年的天数条件
            case 2:
                if(isLeap(year) && day > 29) return "";
                if(!isLeap(year) && day > 28) return "";
            case 4:
                if(day > 30) return "";
            case 6:
                if(day > 30) return "";
            case 9:
                if(day > 30) return "";
            case 11:
                if(day > 30) return "";
            default:
                break;
        }

        //将int变为字符串,- ""即可
        String yearS = year + "";
        String monthS = month + "";
        String dayS = day + "";
        //补0
        if(monthS.length() == 1) monthS = '0' + monthS;
        if(dayS.length() == 1) dayS = '0' + dayS;
        //返回日期
        return yearS + "-" + monthS + "-" + dayS;
    }

    //判断是否为闰年
    static boolean isLeap(int year){
        return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0);
    }
}

你可能感兴趣的:(蓝桥杯,蓝桥杯,java,职场和发展)