2017真题日期问题

07、日期问题

1、问题重述

标题:日期问题

小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在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

问题分析:本身没什么难的慢慢调试就行了!

有三种情况,分布把字符串的三部分看成年月日,输出一个字符串,这时候就体现函数的魅力了,根据参数传递的不同进行相同的处理,就是一个helper(int year, int month, int day),不要怕这些类型转换的问题,用多了就习惯了。

int转string 直接加“”

string str = 87 + “”

static boolean isLeap(int year) {
        return (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
    }


    static String f(int a, int b, int c) {  //这个函数的目的是什么? 返回一个满足条件的 拼接好的字符串
        if (a >= 0 && a <= 59)a += 2000;
        else if (a >= 60 && a <= 99)a += 1900;
        else return "";

        if (b < 1 || b > 12)return "";
        if (c < 1 || c > 31)return "";

        boolean _isLeap = isLeap(a);
        switch (b) {//日期校验
            case 2:
                if (_isLeap && c > 29)return "";
                if (!_isLeap && c > 28)return "";
                break;
            case 4:
                if (c > 30)return "";
                break;
            case 6:
                if (c > 30)return "";
                break;
            case 9:
                if (c > 30)return "";
                break;
            case 11:
                if (c > 30)return "";
                break;
            default:
                break;
        }
        String _a=a+"", _b=b+"", _c=c+"";   //转换为字符串

        if (_b.length() == 1)
            _b = "0" + _b;
        if (_c.length() == 1)
            _c = "0" + _c;

        return _a + "-" + _b + "-" + _c;
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String in=sc.nextLine();

        int a = 0, b = 0, c = 0;
//        a = (in.charAt(0) - '0') * 10 + (in.charAt(1)- '0');    //可以直接强转成int
//        b = (in.charAt(3)- '0') * 10 + (in.charAt(4) - '0');
//        c = (in.charAt(6) - '0') * 10 + (in.charAt(7) - '0');
        a = Integer.parseInt(in.substring(0,2));
        b = Integer.parseInt(in.substring(3,5));
        c = Integer.parseInt(in.substring(6,8));
        System.out.println("a="+a+"\t"+"b="+b+"\t"+"c="+c);
        String case1 = f(a, b, c);
        String case2 = f(c, a, b);
        String case3 = f(c, b, a);
        /*TreeSet带去重和排序功能*/
        Set<String> ans=new TreeSet<String>();
        if (case1 != "")ans.add(case1);
        if (case2 != "")ans.add(case2);
        if (case3 != "")ans.add(case3);
        for (String s:ans) {
            System.out.println(s);
        }
    }

总结:

我们要弄懂函数的作用是什么在实现那个函数:

比如本题中函数的作用就是通过参数传递拼接满足条件的字符串并返回所以中间把不满足的全部返回空串,在使用set去重

posted @ 2020-04-05 11:31  贝加尔湖畔╭  阅读(209)  评论(0编辑  收藏  举报