2017年第八届蓝桥杯省赛试题

7、日期问题
小明正在整理一批历史文献。这些历史文献中出现了很多日期。小明知道这些日期都在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,否则按无效代码处理。

import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;

public class t07 {
	static String[][] result = new String[3][3];
	
	static int getDayC(int year, int month) {
		int dayC = 0;
		switch(month) {
			case 1:
			case 3:
			case 5:
			case 7:
			case 8:
			case 10:
			case 12:
				dayC=31;
				break;
			case 4:
			case 6:
			case 9:
			case 11:
				dayC=30;
				break;
			case 2:
				if(year%4==0 && year%100!=0 || year%400==0) {dayC=29;break;}
				else {dayC=28;break;}
		}
		return dayC;
	}
	static boolean isRight(int i) {
		if(getYear(result[i][0]) > 2059 || getYear(result[i][0]) < 1960 || getYear(result[i][0]) == -1) { return false;}
		if(Integer.parseInt(result[i][1]) > 12 || Integer.parseInt(result[i][1]) <= 0) {return false;}
		if(Integer.parseInt(result[i][2]) > getDayC(Integer.parseInt(result[i][0]), Integer.parseInt(result[i][1])) || Integer.parseInt(result[i][2]) <= 0) {return false;}
		return true;
	}
	static void swap(String[] max, String[] min) {
		String[] temp = max;
		max = min;
		min = temp;
	}
	static int getYear(String year) {
		int y = Integer.parseInt(year);
		if(y<60) return (2000+y);
		else if(y>=0) return (1900+y);
		else return -1;
	}
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String s = sc.next();
		String[] data = s.split("/");
		
		
		for(int i=0; i<3; i++) {
			if(i == 0 ) { result[i][0] = data[0]; result[i][1] = data[1]; result[i][2] = data[2];}
			if(i == 1 ) { result[i][0] = data[2]; result[i][1] = data[0]; result[i][2] = data[1];}
			if(i == 2 ) { result[i][0] = data[2]; result[i][1] = data[1]; result[i][2] = data[0];}
		}
		Set<String> ss = new TreeSet<String>();
		for(int i=0; i<3; i++) {
			if(isRight(i)) {
				String temp = getYear(result[i][0])+"-"+result[i][1]+"-"+result[i][2];
				ss.add(temp);
			}
		}
		for(String sss:ss) {
			System.out.println(sss);
		}
	}

}

学到两点:

  1. treeset对字符串也会排序
  2. 注意日期的范围不能等于小于零,需要在代码中表现出来

参考链接:
https://blog.csdn.net/weixin_41793113/article/details/87976875
这位博主写的十分清晰,代码量也很少

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值