第八届蓝桥杯省赛真题--日期问题

本文介绍了一个日期解析问题,目标是从不规范的历史文献日期格式中,找出所有可能的有效日期表示方式。文章提供了详细的解题思路和Java代码实现,利用TreeSet进行结果存储,确保输出的日期既不重复又有序。

一、问题描述

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

  请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。不要使用package语句。不要使用jdk1.7及以上版本的特性。主类的名字必须是:Main,否则按无效代码处理。

二、题目类型:编程大题

三、解题思路及代码

  这道题我是用暴力破解方法写的代码。。。看起来很繁琐,但思路流程如下:

    1、用 Scanner 的 next() 方法接收一个字符串,并用 String 的 split() 方法把 “/” 筛掉,然后转成 int[] ;

    2、直接顺序判断是否符合年/月/日、月/日/年、日/月/年这三个格式,如果符号就把 int[] 数组中的数据转为以 “-” 连接的字符串,并加入 TreeSet 容器中;

    3、用 Iterator 遍历输出 TreeSet 中的内容

 1 import java.util.Iterator;
 2 import java.util.Scanner;
 3 import java.util.Set;
 4 import java.util.TreeSet;
 5 
 6 public class DateProblem {
 7 
 8     public static void main(String[] args) {
 9         Scanner input = new Scanner(System.in);
10         String s = input.next();
11         String[] arr = s.split("/");
12         int[] num = new int[arr.length];
13         for (int i = 0; i < num.length; i++) {
14             num[i] = Integer.parseInt(arr[i]);
15         }
16         Set<String> set = new TreeSet<>();
17         //判断是否满足年/月/日格式
18         if ((num[0] >= 0 && num[0] <= 60) && (num[1] >= 1 && num[1] <= 12) && (num[2] >= 1 && num[2] <= 31)) {
19             String str = null;
20             if (num[0] >= 60) {
21                 str = "19" + arr[0] + "-" + arr[1] + "-" + arr[2];
22             } else {
23                 str = "20" + arr[0] + "-" + arr[1] + "-" + arr[2];
24             }
25             set.add(str);//若满足则加入set中
26         }
27         //判断是否满足月/日/年格式
28         if ((num[0] >= 1 && num[0] <= 12) && (num[1] >= 1 && num[1] <= 31) && (num[2] >= 0 && num[2] <= 60)) {
29             String str = null;
30             if (num[2] >= 60) {
31                 str = "19" + arr[2] + "-" + arr[0] + "-" + arr[1];
32             } else {
33                 str = "20" + arr[2] + "-" + arr[0] + "-" + arr[1];
34             }
35             set.add(str);
36         }
37         //判断是否满足日/月/年格式
38         if ((num[0] >= 1 && num[0] <= 31) && (num[1] >= 1 && num[1] <= 12) && (num[2] >= 0 && num[2] <= 60)) {
39             String str = null;
40             if (num[2] >= 60) {
41                 str = "19" + arr[2] + "-" + arr[1] + "-" + arr[0];
42             } else {
43                 str = "20" + arr[2] + "-" + arr[1] + "-" + arr[0];
44             }
45             set.add(str);
46         }
47         //输出
48         Iterator<String> iter = set.iterator();
49         while (iter.hasNext()) {
50             System.out.println(iter.next());
51         }
52     }
53 }

四、反思与总结

  自己对于集合框架的使用还不够熟练,有待加强!

 


 

转载于:https://www.cnblogs.com/crush-u-1214/p/10532849.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值