日期问题题解

博客分析了日期问题的三种错误情况,并提供了修正方法。针对1960年至2059年的有效日期,考虑月份和日期的合法性,以及如何处理相同日期的不同表示。解决方案中提到了使用TreeSet进行排序和去重。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

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

public class Main {

	public static void main(String[] args) {
		new Main();
	}
	TreeSet<String>set=new TreeSet<String>();
	public Main() {
		Scanner in = new Scanner(System.in);
		String s=in.next();
		String ss[]=s.split("/");
		int arr[]=new int[3];
		for(int i=0;i<3;i++){
			arr[i]=Integer.parseInt(ss[i]);
		} 
		//三种可能
		check(arr[0],arr[1],arr[2]);
		check(arr[2],arr[0],arr[1]);
		check(arr[2],arr[1],arr[0]);
		for(String v:set)
			System.out.println(v);
	}
	int f[]= {31,31,28,31,30,31,30,31,31,30,31,30,31};//平
	int d[]= {31,31,29,31,30,31,30,31,31,30,31,30,31};//润
	void check(int a,int b ,int c) {
		if(b>12||c>31||c<=0||b<=0)return;
		//年份加前导数字
		if(a>=60)a=Integer.parseInt("19"+a);
		else 
			if(a>10)a=Integer.parseInt("20"+a);
			else a=Integer.parseInt("200"+a);
		if(a%400 == 0 || a%4 == 0 && a%100 != 0) {//润年
			if(c>d[b])return;
			String b1=""+b;
			String c1=""+c;
			if(b<10)b1='0'+b1;//加前导0
			if(c<10)c1='0'+c1;
			set.add(a+"-"+b1+"-"+c1);
		}else {
			if(c>f[b])return;
			String b1=""+b;
			String c1=""+c;
			if(b<10)b1='0'+b1;//加前导0
			if(c<10)c1='0'+c1;
			set.add(a+"-"+b1+"-"+c1);
		}
	}
}

分析:根据题意给定一个日期他可能有三种错的情况,所以只需要判断纠正后的三种情况都是正确的日期;

1.1960.1.1-2059.12.31:也就是表示年的两位数只能加前导19和20,加19时,该二位数不惜大于等于60,加20时,该二位数必须小于等于59;

2.给定的三个两位数都是[0,9]组成,那么当月和日小于等于0和大于当年(润平年)的该月的最大天数时,该日期也是不对的;

3.题目求的有多少种“不同的”日期可能,当年月日相同时看为一种;

4.多个日期按照从大到小排序,可以使用TreeSet,排序和去重

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值