题目描述
小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在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
小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在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
分析:这道题考的细节处理比较多,一不注意就会得不到满分
1.月日的范围要合理,大于0不要忽略
2.如果月份是二月,就要结合年份一起判断是否合理
3.三种日期里面可能出现重复的,比如03/02/03,结果不一定是三个
4.日期要按照从早到晚输出
考虑到这些,就比较简单了,上代码:
import java.util.*;
public class Main {
static Scanner in = new Scanner(System.in);
static Set<String> st = new TreeSet<String>();
static int[][] days = {{0,31,28,31,30,31,30,31,31,30,31,30,31},//平年
{0,31,29,31,30,31,30,31,31,30,31,30,31}//闰年
};
static boolean isLeap(String year) {
int y = Integer.valueOf(year);
if(y%400==0||(y%4==0&&y%100!=0))
return true;
return false;
}
public static void main(String[] args) {
st.clear();
String s = in.next();
String[] ss = s.split("/");
String ans = "",temp="";
int a,b,c;
a = Integer.valueOf(ss[0]);
b = Integer.valueOf(ss[1]);
c = Integer.valueOf(ss[2]);
//第一种情况的年份
if(a>=0&&a<=59) ans+="20";
else ans+="19";
//判断日期是否合理
if(isLeap(ans+ss[0])) {
if(b>0&&b<13&&c<=days[1][b]) {
ans+=ss[0]+"-"+ss[1]+"-"+ss[2];
st.add(ans);
}
}else {
if(b>0&&b<13&&c<=days[0][b]) {
ans+=ss[0]+"-"+ss[1]+"-"+ss[2];
st.add(ans);
}
}
ans="";
//第二种情况的年份
if(c>=0&&c<=59) ans+="20";
else ans+="19";
//判断日期是否合理
if(isLeap(ans+ss[2])) {
temp = ans;
if(b>0&&b<13&&a<=days[1][b]) {
temp+=ss[2]+"-"+ss[1]+"-"+ss[0];
st.add(temp);
}
if(a>0&&a<13&&b<=days[1][a]) {
ans+=ss[2]+"-"+ss[0]+"-"+ss[1];
st.add(ans);
}
}else {
temp = ans;
if(b>0&&b<13&&a<=days[0][b]) {
temp+=ss[2]+"-"+ss[1]+"-"+ss[0];
st.add(temp);
}
if(a>0&&a<13&&b<=days[0][a]) {
ans+=ss[2]+"-"+ss[0]+"-"+ss[1];
st.add(ans);
}
}
//利用集合set去重
Iterator<String> it = st.iterator();
while(it.hasNext())
System.out.println(it.next());
}
}
思考:这里排序的话,由于我使用的是treeMap,本身就是个有序集合,所以不用再排序了
其实可以把判断方法封装一下,代码会更简单