[蓝桥杯 2017 省 B] 日期问题 java实现

12 篇文章 0 订阅

# [蓝桥杯 2017 省 B] 日期问题

## 题目描述

小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在 1960 年 1 月 1 日至 2059 年 12 月 31 日。令小明头疼的是,这些日期采用的格式非常不统一,有采用`年/月/日`的,有采用`月/日/年`的,还有采用`日/月/年`的。更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。

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

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

## 输入格式

一个日期,格式是 `AA/BB/CC`。($0\le A, B, C\le 9$)

## 输出格式

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

## 样例 #1

### 样例输入 #1

```

02/03/04

```

### 样例输出 #1

```

2002-03-04

2004-02-03

2004-03-02

```


import java.util.*;
class Main
{
    static Map<Integer,Integer> map=new HashMap<>();
    static List<String> list=new ArrayList<>();
    
    public static void main(String[] args) {
            // TODO Auto-generated method stub
        
        map.put(1, 31);
        map.put(2, 28);
        map.put(3, 31);
        map.put(4, 30);
        map.put(5, 31);
        map.put(6, 30);
        map.put(7, 31);
        map.put(8, 31);
        map.put(9, 30);
        map.put(10, 31);
        map.put(11, 30);
        map.put(12, 31);
        
        Scanner sc=new Scanner(System.in);    
        String[] arr=sc.nextLine().split("/");
        
        int n1=Integer.valueOf(arr[0]);
        int n2=Integer.valueOf(arr[1]);
        int n3=Integer.valueOf(arr[2]);
        
        if (n2>=1&&n2<=12)
        {
            StringBuilder sb=new StringBuilder();
            func(n1,n2,n3,sb);
        }
        
        if (n1>=1&&n1<=12)
        {
            StringBuilder sb=new StringBuilder();
            func(n3,n1,n2,sb);
        
        }
        
        if (n2>=1&&n2<=12)
        {
            StringBuilder sb=new StringBuilder();
            func(n3,n2,n1,sb);
        
        }
        //System.out.println(list.toString());
        Collections.sort(list,(o1,o2)->{
            int[] arr1=new int[3];
            int[] arr2=new int[3];
            
            String[] s1=o1.split("-");
            String[] s2=o2.split("-");
            
            for (int i=0;i<3;i++)
            {
                arr1[i]=Integer.valueOf(s1[i]);
                arr2[i]=Integer.valueOf(s2[i]);
                
            }
            
            if (arr1[0]!=arr2[0])
            {
                return arr1[0]-arr2[0];
            }
            else if (arr1[1]!=arr2[1])
            {
                return arr1[1]-arr2[1];
            }
            else
            {
                return arr1[2]-arr2[2];
            }
        });
        for (int i=0;i<list.size();i++)
        {
        System.out.println(list.get(i));
        }
        sc.close();
    }
    public static boolean judge(int n)
    {
        return (n%4==0&&n%100!=0)||(n%400==0);
    }
    public static void func(int n1,int n2,int n3,StringBuilder sb)
    {
        int year=0;
        
        if (n1>=0&&n1<=59)
        {
            year=2000+n1;
            sb.append("20");
        }
        else
        {
            year=1900+n1;
            sb.append("19");
        }
        
            if (judge(year))
            {
                if (n2==2)
                {
                    if (n3<1||n3>29)
                    {
                        return;
                    }
                }
                else
                {
                    if (n3<1||n3>map.get(n2))
                    {
                        return;
                    }
                }
            }
            else
            {
                if (n3<1||n3>map.get(n2))
                {
                    return;
                }
            }
            
        
        if (n1<10&&n1>=0)
        {
            sb.append("0");
        }
        sb.append(n1);
        
        sb.append("-");
        
        if (n2<10&&n2>=0)
        {
            sb.append("0");
        }
        sb.append(n2);
        
        sb.append("-");
        
        if (n3<10&&n3>=0)
        {
            sb.append("0");
        }
        sb.append(n3);
        String s=sb.toString();
        
        if (!list.contains(s))
        {
            list.add(s);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值