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

题目

小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在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. Date类的使用错误,构造方法new Date(int year ,int month ,int day) ,其中year是从1900年开始算起,也就代表着2022年应该用2022-1900表示,month的取值范围是0-11,day的取值范围是1-31.
  2. 对于这种日期的问题,一定不要忘了考虑闰年的问题。闰年的2月有29天,平年是28天。闰年是可以被4整除,但是不能被100整除,或者是可以被400整除。
  3. 读题不仔细!!!,真实服了题目中说可以是年月日、月日年和日月年三种情况,我写了半天六种情况,结果比标准答案多出来还几个结果。以后读什么题,一定要细心在细心,一字一句的读完它。
  4. 最后忘了查重了,输入为02/02/29,正确答案为:2029-02-02。我的输出是
    2029-02-02
    2029-02-02
    太粗心了…
    代码写的还又臭又长…
	static HashSet<String> S=new HashSet<String>();
	public static void main(String[] args) {
		
		Scanner in=new Scanner(System.in);
		String t=in.next();
		String[] tt=t.split("/");
		int a=Integer.parseInt(tt[0]);
		int b=Integer.parseInt(tt[1]);
		int c=Integer.parseInt(tt[2]);
		if(a>b&&a>c)
		{	
			f(jj(c,b,a));
			f(jj(c,a,b));
			f(jj(a,b,c));
		}
		else if(b>a&&b>c)
		{
			if(a>c)
			{
				f(jj(c,a,b));f(jj(c,b,a));f(jj(a,b,c));
			}
			else {
				f(jj(a,b,c));f(jj(c,a,b));f(jj(c,b,a));
			}
		}
		else if(b>a)
		{
			f(jj(a,b,c));f(jj(c,a,b));f(jj(c,b,a));
		}
		else {
			f(jj(a,b,c));f(jj(c,b,a));f(jj(c,a,b));
		}
	}
	
	static String jj(int a,int b,int c)
	{
		Format d=new SimpleDateFormat("yyyy-MM-dd");
		int t=0;
		if(a>=60)
			if((19*100+a)%4==0&&(19*100+a)%100!=0||(19*100+a)%400==0)
				t=29;
			else 
				t=28;
		else 
			if((20*100+a)%4==0&&(20*100+a)%100!=0||(20*100+a)%400==0)
				t=29;
			else 
				t=28;
		if(b>12||c>31||b==0||c==0) return "";
			if(b==1||b==3||b==5||b==7||b==8||b==10||b==12)
			{
				if(c<=31)
				{
					if(a>=60)
						return d.format(new Date(19*100+a-1900, b-1, c));
					else 
						return d.format(new Date(20*100+a-1900, b-1, c));
				}
				
			}
			else if(b==2)
			{
				if(c<=t)
					if(a>=60)
						return d.format(new Date(19*100+a-1900, b-1, c));
					else 
						return d.format(new Date(20*100+a-1900, b-1, c));
			}
			else if(b!=0)
			{
				if(c<=30)
					if(a>=60)
						return d.format(new Date(19*100+a-1900, b-1, c));
					else 
						return d.format(new Date(20*100+a-1900, b-1, c));
			}
		return "";
	}
	static void f(String s)
	{
		if(!s.equals("")&&!S.contains(s))
		{
			S.add(s);
			System.out.println(s);
		}
			
	}
上一篇:LAMMPS分子动力学模拟


下一篇:es boolquery 的几种用法