日期问题(蓝桥杯)

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

解析:因为日期的格式有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的,所以说输入的日期有可能第一个是年,有可能第三个是年;倘若输入的年份大于等于60且小于等于99,则说明年份一定是19年的,否则就是20年的。综上所述日期排列有六种情况;

输入的日期可能不合法,所以还需要检测输入的日期是否合法。

详细请点击该链接查看如何检测日期是否合法:https://blog.csdn.net/qq_41113002/article/details/87460533

代码如下:(虽然代码有点长,但是耗时大约50ms左右)

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.Scanner;

class STU1 implements Comparable<STU1>   //该类相当于C语言中的结构体
{										//可以类似于结构体排序的类
	private int y;
	private int m;
	private int d;
	
	public STU1(int y, int m, int d)
	{
		this.y = y;   //年
		this.m = m;   //月
		this.d = d;   //日
	}
	@Override
	public int hashCode() //比较hash值    点击鼠标右键Source点击Generate hashCode() and equals()
	{						//系统会自动写入hashCode()方法和equals()方法
		final int prime = 31;
		int result = 1;
		result = prime * result + d;
		result = prime * result + m;
		result = prime * result + y;
		return result;
	}
	@Override
	public boolean equals(Object obj) //比较地址 点击鼠标右键Source点击Generate hashCode() and equals()
	{                        //系统会自动写入hashCode()方法和equals()方法
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		STU1 other = (STU1) obj;
		if (d != other.d)
			return false;
		if (m != other.m)
			return false;
		if (y != other.y)
			return false;
		return true;
	}

	public int getY()   //获取年
	{
		return y;
	}

	public int getM()  //获取月
	{
		return m;
	}

	public int getD()  //获取日
	{
		return d;
	}

	@Override
	public int compareTo(STU1 o)   //相当于C语言的结构体比较方法
	{
		if(this.y!=o.y)       //先比较年
		{
			return this.y-o.y;   //升序排序
		}
		else if(this.m!=o.m)     //然后比较月
		{
			return this.m-o.m;   //升序排序
		}
		else if(this.d!=o.d)     //最后比较日
		{
			return this.d-o.d;   //升序排序    如果是this.d-o.d则表示降序排序
		}
		return 0;
	}
}

public class 日期问题
{
	private static ArrayList<STU1> stu = new ArrayList<STU1>(); //存放一个有效日期
	
	public static void Method(String year,String month,String day) throws ParseException
	{
		int y = Integer.parseInt(year);   //年
		int m = Integer.parseInt(month);  //月
		int d = Integer.parseInt(day);    //日
		String str = year+"/"+month+"/"+day;    
		SimpleDateFormat simple = new SimpleDateFormat("yyyy/MM/dd");  //日期格式
		Date date = simple.parse(str);   //转换为Date类型
		STU1 st = new STU1(y,m,d);      //存放日期的类
		int y2 = date.getYear()+1900;   //转换为Date类型的年
		int m2 = date.getMonth()+1;     //转换为Date类型的月
		int d2 = date.getDate();        //转换为Date类型的日
		if(stu.contains(st)||y2!=y||m2!=m||d2!=d) //该日期已存在或年月日不等
		{
			return;
		}
		stu.add(st);  //添加一个合法日期
	}

	public static void main(String[] args) throws Exception
	{
		Scanner in = new Scanner(System.in);
		String str = in.next();
		long start = System.currentTimeMillis();  //计算耗时,与本题无关
		String[] s = new String[3];
		s = str.split("/");  //切割
		int y1 = Integer.parseInt(s[0]);  //第一个是年的情况
		int y2 = Integer.parseInt(s[2]);  //第三个是年的情况
		if(y1>=60&&y1<=99)  //年份一定是19开头
		{
			Method("19"+s[0],s[1],s[2]);  //年月日排序
		}
		else  //年份一定是20开头
		{
			Method("20"+s[0],s[1],s[2]);
		}
		if(y2>=60&&y2<=99)  //年份一定是19开头
		{
			Method("19"+s[2],s[1],s[0]);
			Method("19"+s[2],s[0],s[1]);
		}
		else   //年份一定是20开头
		{
			Method("20"+s[2],s[1],s[0]);
			Method("20"+s[2],s[0],s[1]);
		}
		Collections.sort(stu);   //类似于C语言结构体排序
		for(int i=0,t=stu.size();i<t;++i)
		{
			System.out.print(stu.get(i).getY()+"-");
			System.out.printf("%02d",stu.get(i).getM());
			System.out.print("-");
			System.out.printf("%02d",stu.get(i).getD());
			System.out.print("\n");
		}
		long last = System.currentTimeMillis() - start;  //计算耗时,与本题无关
		System.out.println("耗时:"+last+"ms");  //计算耗时,与本题无关
	}
}

运行结果:

输入:

36/02/28

输出:

2036-02-28
耗时:43ms

输入:

02/03/04

输出:

2002-03-04
2004-02-03
2004-03-02
耗时:48ms

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值