第八届蓝桥杯JavaB组省赛-日期问题
作者:互联网
题目
小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在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,否则按无效代码处理。
思路:枚举
思路很简单,但是这个简单题写了一下午,总是出错。总结一下自己失误的原因:
- Date类的使用错误,构造方法new Date(int year ,int month ,int day) ,其中year是从1900年开始算起,也就代表着2022年应该用2022-1900表示,month的取值范围是0-11,day的取值范围是1-31.
- 对于这种日期的问题,一定不要忘了考虑闰年的问题。闰年的2月有29天,平年是28天。闰年是可以被4整除,但是不能被100整除,或者是可以被400整除。
- 读题不仔细!!!,真实服了题目中说可以是年月日、月日年和日月年三种情况,我写了半天六种情况,结果比标准答案多出来还几个结果。以后读什么题,一定要细心在细心,一字一句的读完它。
- 最后忘了查重了,输入为02/02/29,正确答案为:2029-02-02。我的输出是
2029-02-02
2029-02-02
太粗心了…
代码写的还又臭又长…
static HashSet<String> S=new HashSet<String>();
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
String t=in.next();
String[] tt=t.split("/");
int a=Integer.parseInt(tt[0]);
int b=Integer.parseInt(tt[1]);
int c=Integer.parseInt(tt[2]);
if(a>b&&a>c)
{
f(jj(c,b,a));
f(jj(c,a,b));
f(jj(a,b,c));
}
else if(b>a&&b>c)
{
if(a>c)
{
f(jj(c,a,b));f(jj(c,b,a));f(jj(a,b,c));
}
else {
f(jj(a,b,c));f(jj(c,a,b));f(jj(c,b,a));
}
}
else if(b>a)
{
f(jj(a,b,c));f(jj(c,a,b));f(jj(c,b,a));
}
else {
f(jj(a,b,c));f(jj(c,b,a));f(jj(c,a,b));
}
}
static String jj(int a,int b,int c)
{
Format d=new SimpleDateFormat("yyyy-MM-dd");
int t=0;
if(a>=60)
if((19*100+a)%4==0&&(19*100+a)%100!=0||(19*100+a)%400==0)
t=29;
else
t=28;
else
if((20*100+a)%4==0&&(20*100+a)%100!=0||(20*100+a)%400==0)
t=29;
else
t=28;
if(b>12||c>31||b==0||c==0) return "";
if(b==1||b==3||b==5||b==7||b==8||b==10||b==12)
{
if(c<=31)
{
if(a>=60)
return d.format(new Date(19*100+a-1900, b-1, c));
else
return d.format(new Date(20*100+a-1900, b-1, c));
}
}
else if(b==2)
{
if(c<=t)
if(a>=60)
return d.format(new Date(19*100+a-1900, b-1, c));
else
return d.format(new Date(20*100+a-1900, b-1, c));
}
else if(b!=0)
{
if(c<=30)
if(a>=60)
return d.format(new Date(19*100+a-1900, b-1, c));
else
return d.format(new Date(20*100+a-1900, b-1, c));
}
return "";
}
static void f(String s)
{
if(!s.equals("")&&!S.contains(s))
{
S.add(s);
System.out.println(s);
}
}
标签:02,JavaB,int,else,蓝桥,jj,new,100,组省赛 来源: https://blog.csdn.net/m0_52238102/article/details/123170004