标题:日期问题小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在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,否则按无效代码处理。
思路:
这道题目看似简单,但是需要考虑的条件比较多。
- 注意题目给的日期范围:1960年1月1日至2059年12月31日
- 注意月份范围:1-12之内
- 需要判断平、闰年,从而确定2月的天数
- 需要去掉重复的日期,如:04/04/04
- 日期需要从早到晚进行排序:集合递增排序
JAVA代码:
package 第八届蓝桥杯;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class 日期问题 {
static String[] dateStr = new String[3]; //存储年、月、日
static Date[] date = new Date[6]; //1960-2059年,共有6种情况
static int Month[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //月份天数
/*
* 判断平、闰年
* 1、非整百年:能被4整除的为闰年。(如2004年就是闰年,2001年不是闰年)
* 2、整百年:不能被100整除,能被400整除的是闰年。(如2000年是闰年,1900年不是闰年)
*/
static boolean isLeapYear(int year) {
if(year%4==0 || ( year%100!=0 && year%400==0 ))
return true;
return false;
}
//判断月份的天数
static boolean judgeMonth(int year, int month, int day) {
if(year<1960 || year>2059) //日期范围:1960年1月1日至2059年12月31日
return false;
if(month<0 || month>12) //月份必须在1-12之内
return false;
if(month == 2) {
if(isLeapYear(year)==false) //平年
return 28>=day && 1<=day;
else
return Month[month]>=day && 1<=day; //闰年
}
else
return Month[month]>=day && 1<=day;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
String str = input.next();
dateStr = str.split("/");
int a = Integer.parseInt(dateStr[0]); //转为整型
int b = Integer.parseInt(dateStr[1]);
int c = Integer.parseInt(dateStr[2]);
// 年/月/日、月/日/年、日/月/年
date[0] = new Date(1900+a, b, c);
date[1] = new Date(2000+a, b, c);
date[2] = new Date(1900+c, a, b);
date[3] = new Date(2000+c, a, b);
date[4] = new Date(1900+c, b, a);
date[5] = new Date(2000+c, b, a);
Arrays.sort(date); //默认排全部
Set<String> set = new HashSet<String>(); //Set保证了集合中的元素不重复
for(int i=0; i<date.length; i++) {
if(judgeMonth(date[i].year, date[i].month, date[i].day) && !set.contains(date[i].toString())) { //contains()方法:如果此 set 包含指定元素,则返回 true
set.add(date[i].toString()); //如果此 set 中尚未包含指定元素,则添加指定元素。
System.out.println(date[i].toString()); //调用重写的toString()方法,格式已设定
}
}
}
}
//排序日期,从早到晚
class Date implements Comparable<Date>{
int year;
int month;
int day;
Date(int year, int month, int day) {
this.year = year;
this.month = month;
this.day = day;
}
@Override
public int compareTo(Date d) {
if(this.year == d.year) { //如果年份相同,按月份递增排序
if(this.month == d.month) //如果月份相同,按天数递增排序
return this.day-d.day;
else
return this.month-d.month; //月份不同,按月份递增排序
}
else
return this.year-d.year; //如果年份不同,按年份递增排序
}
@Override
public String toString() {
if(month<10 || day<10) {
return year+"-0"+month+"-0"+day;
}
return year+"-"+month+"-"+day;
}
}