日期問題(藍橋杯)

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章