你好呀,我是灰小猿,一個超會寫bug的程式猿!
歡迎大家關注我的專欄“每日藍橋”,該專欄的主要作用是和大家分享近幾年藍橋杯省賽及決賽等真題,決議其中存在的演算法思想、資料結構等內容,幫助大家學習到更多的知識和技術!
標題:日期問題
小明正在整理一批歷史文獻.這些歷史文獻中出現了很多日期.小明知道這些日期都在1960
年1月1日至2059年12月31日.令小明頭疼的是,這些日期采用的格式非常不統- -,有
采用年/月/日的,有采用月1日/年的,還有采用8/月/年的.更加麻煩的是,年份也都省略了
前兩位,使得文獻上的-一個日期,存在很多可能的日期與其對應.
比如02/03/04,可能是2002年03月04日.2004年02月03榷訓2004年03月02日.
給出一個文獻上的日期,你能幫助小明判斷有哪些可能的日期對其對應嗎?
輸入:
一個日期,格式是"AA/BB/CC". (0<≈=A,B,C<= 9)
輸入:
輸出若干個不相同的日期,每個日期一行,格式是"yyy-MM-dd".多個8期按從早到晚排
列.
樣例輸人
02/03/04
樣例輸出
2002-03-04
2004-02-03
2004-03-02
【資源約定】
峰值記憶體消耗(含虛擬機) < 256M
CPU消耗< 1000ms,
請嚴格按要求輸出,不要畫蛇添足地列印類似:“ 請您輸..”的多余內容.
所有代碼放在同一個源檔案中,除錯通過后,拷貝提交該原始碼.
不要使用package陳述句.不要使用jdk1.7及以上版本的特性.
主類的名字必須是: Main, 否則按無效代碼處理.
解題思路:
本題在進行求解的時候的步驟可以分為:
- 1對輸入的字串提取出三個時間資料
- 依次假設三個時間資料分別是年月日、月日年、日月年三種,
- 判斷在每一種情況下,資料是否符合相應的要求,比如如果a資料表示日,則0<a<=31{同時還應該考慮是不是31天的月份},假設資料b是表示月,則0<b<=12,
- 考慮閏年中二月是29天,平年是28天
- 將符合要求的資料按照年月日組成一個整數,存入陣列(注意去重)
- 將所有存入陣列的資料進行排序
- 將排序后的日期按年-月-日格式輸出
答案原始碼:
import java.util.Arrays; import java.util.HashSet; import java.util.Scanner; import java.util.Set; /**標題:日期問題 小明正在整理一批歷史文獻.這些歷史文獻中出現了很多日期.小明知道這些日期都在1960 年1月1日至2059年12月31日.令小明頭疼的是,這些日期采用的格式非常不統- -,有 采用年/月/日的,有采用月/日/年的,還有采用8/月/年的.更加麻煩的是,年份也都省略了 前兩位,使得文獻上的-一個日期,存在很多可能的日期與其對應. 比如02/03/04,可能是2002年03月04日.2004年02月03榷訓2004年03月02日. 給出一個文獻上的日期,你能幫助小明判斷有哪些可能的日期對其對應嗎? 輸入: 一個日期,格式是"AA/BB/CC". (0<≈=A,B,C<= 9) 輸入: 輸出若干個不相同的日期,每個日期一行,格式是"yyy-MM-dd".多個8期按從早到晚排 列.*/ //1960年1月1日至2059年12月31日. //年/月/日的,有采用月/日/年的,還有采用日/月/年 public class Year2017_Bt7 { static Set<Integer> ansList = new HashSet<Integer>(); public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String time = scanner.next(); // String time = "02/02/27"; String []strTimeArr = time.split("/"); int [] intTimeArr = new int[3]; for (int i = 0; i < strTimeArr.length; i++) { intTimeArr[i] = Integer.parseInt(strTimeArr[i]); } f(intTimeArr); Object[] ansArr = ansList.toArray(); Arrays.sort(ansArr); for (int i = 0; i < ansArr.length; i++) { String s = ansArr[i].toString(); System.out.println(s.substring(0, 4) + "-" + s.substring(4, 6) + "-" + s.substring(6, 8)); } } /** * 將存盤時期的陣列轉換成具體的時間 * */ private static void f(int[] intTimeArr) { // 年月日 if (intTimeArr[1]<=12&&intTimeArr[1]>0&&intTimeArr[2]>0&&intTimeArr[2]<=31) { int m = intTimeArr[1]; int d = intTimeArr[2]; int y = 0; // 19年 if (intTimeArr[0]>=60) { y = 1900+intTimeArr[0]; } // 20年 else { y = 2000+intTimeArr[0]; } //判斷如果不是閏年,且是二月,且天數大于29,則不符合要求,不做記錄 if ((!isRun(y)&&m==2&&d>28)||(!check(m, d))) { }else { int ansNum = y*10000+m*100+d; ansList.add(ansNum); } } // 月日年 if (intTimeArr[0]<=12&&intTimeArr[0]>0&&intTimeArr[1]>0&&intTimeArr[1]<=31) { int m = intTimeArr[0]; int d = intTimeArr[1]; int y = 0; // 19年 if (intTimeArr[2]>=60) { y = 1900+intTimeArr[2]; } // 20年 else { y = 2000+intTimeArr[2]; } //判斷如果不是閏年,且是二月,且天數大于29,則不符合要求,不做記錄 if ((!isRun(y)&&m==2&&d>28)||(!check(m, d))) { }else { int ansNum = y*10000+m*100+d; ansList.add(ansNum); } } // 日月年 if (intTimeArr[0]<=31&&intTimeArr[0]>0&&intTimeArr[1]>0&&intTimeArr[1]<=12) { int m = intTimeArr[1]; int d = intTimeArr[0]; int y = 0; // 19年 if (intTimeArr[2]>=60) { y = 1900+intTimeArr[2]; } // 20年 else { y = 2000+intTimeArr[2]; } //判斷如果不是閏年,且是二月,且天數大于29,則不符合要求,不做記錄 if ((!isRun(y)&&m==2&&d>28)||(!check(m, d))) { }else { int ansNum = y*10000+m*100+d; ansList.add(ansNum); } } } /** * 判斷是不是閏年 * */ private static boolean isRun(int y) { return (y%4==0&&y%100!=0)||(y%400==0); } /** * 判斷在2,4,6,9,11月時,天數是不是31天 * */ private static boolean check(int m,int d) { if ((m==2||m==4||m==6||m==9||m==11)&&d>30) { return false; } return true; } }
輸出樣例:
其中有不足或者改進的地方,還希望小伙伴留言提出,一起學習!
感興趣的小伙伴可以關注專欄!
灰小猿陪你一起進步!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/271323.html
標籤:java
上一篇:百無聊賴之JavaEE從入門到放棄(九)封裝詳解 & 多型詳解
下一篇:super詳解(java)

