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