日期问题--蓝桥杯

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

分析:这道题考的细节处理比较多,一不注意就会得不到满分

         1.月日的范围要合理,大于0不要忽略

         2.如果月份是二月,就要结合年份一起判断是否合理

         3.三种日期里面可能出现重复的,比如03/02/03,结果不一定是三个

         4.日期要按照从早到晚输出

考虑到这些,就比较简单了,上代码:

import java.util.*;

public class Main {
   static Scanner in = new Scanner(System.in);
   static Set<String> st = new TreeSet<String>();
   static int[][] days = {{0,31,28,31,30,31,30,31,31,30,31,30,31},//平年
                          {0,31,29,31,30,31,30,31,31,30,31,30,31}//闰年
                          };
   static boolean isLeap(String year) {
       int y = Integer.valueOf(year);
       if(y%400==0||(y%4==0&&y%100!=0))
           return true;
       return false;
   }
    public static void main(String[] args) {
        st.clear();
        String s = in.next(); 
        String[] ss = s.split("/");
        String ans = "",temp="";
        int a,b,c;
        a = Integer.valueOf(ss[0]);
        b = Integer.valueOf(ss[1]);
        c = Integer.valueOf(ss[2]);  
        //第一种情况的年份
        if(a>=0&&a<=59) ans+="20";   
        else ans+="19";
        //判断日期是否合理
        if(isLeap(ans+ss[0])) {
            if(b>0&&b<13&&c<=days[1][b]) {
                ans+=ss[0]+"-"+ss[1]+"-"+ss[2];
               st.add(ans);
             }
        }else {
            if(b>0&&b<13&&c<=days[0][b]) {
                ans+=ss[0]+"-"+ss[1]+"-"+ss[2];
               st.add(ans);
              }
        }
        ans="";
        //第二种情况的年份
        if(c>=0&&c<=59) ans+="20";   
        else ans+="19";
        //判断日期是否合理
        if(isLeap(ans+ss[2])) {
            temp = ans;
            if(b>0&&b<13&&a<=days[1][b]) {
                temp+=ss[2]+"-"+ss[1]+"-"+ss[0];
               st.add(temp);
              }
            if(a>0&&a<13&&b<=days[1][a]) {
                ans+=ss[2]+"-"+ss[0]+"-"+ss[1];
                st.add(ans);
               }
        }else {
            temp = ans;
            if(b>0&&b<13&&a<=days[0][b]) {
                temp+=ss[2]+"-"+ss[1]+"-"+ss[0];
               st.add(temp);
               }
            if(a>0&&a<13&&b<=days[0][a]) {
                ans+=ss[2]+"-"+ss[0]+"-"+ss[1];
               st.add(ans);
             }
        }
        //利用集合set去重
        Iterator<String> it = st.iterator();
        while(it.hasNext())
            System.out.println(it.next());
   }
}

思考:这里排序的话,由于我使用的是treeMap,本身就是个有序集合,所以不用再排序了

          其实可以把判断方法封装一下,代码会更简单


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值