2017 蓝桥杯JavaB组省赛 日期问题

来源:互联网 发布:windows 高精度sleep 编辑:程序博客网 时间:2024/04/26 05:22

日期问题

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

小明知道这些日期都在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

资源约定:

峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入…” 的多余内容。

解题注意

注意最后的判重、排序、数据是否合理的问题

代码

import java.util.ArrayList;import java.util.Scanner;public class Main {    static ArrayList<Data> data = new ArrayList<>();    public static void main(String[] args) {        Scanner s = new Scanner(System.in);        String[] tmp = s.nextLine().trim().split("/");        // 添加数据        data.add(new Data(Integer.parseInt(tmp[0]), Integer.parseInt(tmp[1]), Integer.parseInt(tmp[2])));        data.add(new Data(Integer.parseInt(tmp[2]), Integer.parseInt(tmp[0]), Integer.parseInt(tmp[1])));        data.add(new Data(Integer.parseInt(tmp[2]), Integer.parseInt(tmp[1]), Integer.parseInt(tmp[0])));        // 去重        wipeRepeat();        // 合理性判断        check();        // 排序        sort();        // 输出        for (Data d : data) {            System.out.println(d.toString());        }    }    static void sort() {        for (int i = 0; i < data.size() - 1; i++)            for (int j = i + 1; j < data.size(); j++) {                int yearI = data.get(i).year;                int yearJ = data.get(j).year;                int monthI = data.get(i).month;                int monthJ = data.get(j).month;                int dayI = data.get(i).day;                int dayJ = data.get(j).day;                if (yearI > yearJ)                    change(i, j);                else if (yearI == yearJ)                    if (monthI > monthJ)                        change(i, j);                    else if (monthI == monthJ)                        if (dayI > dayJ)                            change(i, j);            }    }    static void change(int i, int j) {        Data tmp = data.get(i);        data.set(i, data.get(j));        data.set(j, tmp);    }    static void wipeRepeat() {        for (int i = 0; i < data.size(); i++) {            for (int j = i + 1; j < data.size(); j++)                if (data.get(i).year == data.get(j).year && data.get(i).month == data.get(j).month                        && data.get(i).day == data.get(j).day) {                    data.remove(j);                    wipeRepeat();                    return;                }        }    }    static void check() {        for (int i = 0; i < data.size(); i++) {            int year = data.get(i).year;            int month = data.get(i).month;            int day = data.get(i).day;            if (month < 1 || month > 12) {                data.remove(i);                check();                return;            }            if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) {                if (month == 2)                    if (day < 1 || day > 28) {                        data.remove(i);                        check();                        return;                    }            } else {                if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) {                    if (day < 1 || day > 31) {                        data.remove(i);                        check();                        return;                    }                } else if (month == 2) {                    if (day < 1 || day > 29) {                        data.remove(i);                        check();                        return;                    }                } else {                    if (day < 1 || day > 30) {                        data.remove(i);                        check();                        return;                    }                }            }        }    }}class Data {    int year;    int month;    int day;    public Data(int year, int month, int day) {        if (year >= 60)            this.year = 1900 + year;        else            this.year = 2000 + year;        this.month = month;        this.day = day;    }    @Override    public String toString() {        if (month < 10 && day < 10)            return year + "-0" + month + "-0" + day;        else if (month < 10 && day >= 10)            return year + "-0" + month + "-" + day;        else if (month >= 10 && day < 10)            return year + "-" + month + "-0" + day;        else            return year + "-" + month + "-" + day;    }}
0 0
原创粉丝点击