题目描述
小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在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
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
public class Main {
//用TreeSet去重加排序
static Set<String> answer=new TreeSet<String>();
public static boolean isLeap(int year)
{
//判断是否闰年
return (year%4==0&&year%100!=0)||year%400==0;
}
//f()不满足条件则返回空字符串“”
public static String f(int a,int b,int c)
{
//年份判断
if(a>=0&&a<=59)a+=2000;
else if(a>=60&&a<=99)a+=1900;
else return"";
//月份判断
if(b<1||b>12)return"";
//日判断
if(c<1||c>31)return"";
boolean _isLeap=isLeap(a);//是否闰年
switch (b)
{
case 2:
if(_isLeap==true&&c>29)return"";
if(_isLeap==false&&c>28)return"";
break;
case 4:
if(c>30) return "";
break;
case 6:
if(c>30)return "";
break;
case 9:
if(c>30)return "";
break;
case 11:
if(c>30)return "";
break;
default:
break;
}
//把abc转成字符串
String a1=a+"",b1=b+"",c1=c+"";
//特判当月份和日期为一位数时,补0
if(b1.length()==1)b1="0"+b1;
if(c1.length()==1)c1="0"+c1;
return a1+"-"+b1+"-"+c1;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String date=sc.next();//AA/BB/CC
int a=(date.charAt(0)-'0')*10+date.charAt(1)-'0';
int b=(date.charAt(3)-'0')*10+date.charAt(4)-'0';
int c=(date.charAt(6)-'0')*10+date.charAt(7)-'0';
String ans1=f(a,b,c);
String ans2=f(c,a,b);
String ans3=f(c,b,a);
if(ans1!="")answer.add(ans1);
if(ans2!="")answer.add(ans2);
if(ans3!="")answer.add(ans3);
for (String ans:answer)
{ //输出
System.out.println(ans);
}
sc.close();
}
}