小明正在整理一批歷史文獻。這些歷史文獻中出現了很多日期。小明知道這些日期都在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