博客
关于我
【每日蓝桥】49、一七年省赛Java组真题“日期问题”
阅读量:102 次
发布时间:2019-02-26

本文共 4635 字,大约阅读时间需要 15 分钟。

灰小猿的专栏中有一个关于日期问题的题目,需要根据给定的格式不统一的日期,找出所有可能的对应日期。这个问题看起来有点复杂,但只要按照步骤一步步来,应该不难解决。

首先,我需要理解输入的日期格式。输入的日期是"AA/BB/CC",其中A、B、C都是0到9之间的数字。这种格式意味着同一个日期可能有多种解释方式:

  • 年/月/日:例如,02/03/04 可以是 2002年3月4日。
  • 月/日/年:同样的数字,可能是 2004年2月3日 或者 2004年3月2日。
  • 日/月/年:同样的数字,可能是 2004年3月2日 或者 2002年3月4日。
  • 接下来,我需要处理每一种情况,检查这些组合是否有效。例如,如果A是月份,那么A必须在1到12之间;如果A是日,那么A必须在1到31之间。

    在处理日期的时候,还需要考虑闰年的问题。闰年的判断条件是:能被4整除但不能被100整除,或者能被400整除。这样,在处理二月份的时候,天数会有所不同。

    最后,我需要将所有可能的日期转换成具体的年、月、日组合,并确保这些日期在1960年1月1日到2059年12月31日之间。

    那么,如何将这些思路转化为代码呢?我需要:

  • 解析输入的字符串,提取出三个部分A、B、C。
  • 尝试所有可能的解释方式,检查对应的数值是否有效。
  • 对于有效的情况,计算出年、月、日,并判断是否在有效范围内。
  • 将有效的日期存储起来。
  • 去重并排序,输出结果。
  • 在代码实现中,我需要注意以下几点:

    • 输入处理:使用字符串分割方法提取A、B、C。
    • 日期有效性检查:根据不同的解释方式,检查数值是否在有效范围内。
    • 闰年判断:实现一个函数来判断是否是闰年。
    • 日期存储与排序:使用集合存储日期,避免重复;排序后按年-月-日格式输出。

    接下来,我会尝试编写代码,希望能够正确解决这个问题。

    import java.util.Arrays;import java.util.HashSet;import java.util.Scanner;import java.util.Set;public class Main {    private static Set
    ansList = new HashSet<>(); public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String time = scanner.next(); String[] strTimeArr = time.split("/"); int[] intTimeArr = new int[3]; for (int i = 0; i < strTimeArr.length; i++) { intTimeArr[i] = Integer.parseInt(strTimeArr[i]); } process(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 process(int[] intTimeArr) { // 情况1:AA是年,BB是月,CC是日 if (isValidDate(intTimeArr, 0, 1, 2)) { int year = intTimeArr[0] >= 60 ? 1900 + intTimeArr[0] : 2000 + intTimeArr[0]; int month = intTimeArr[1]; int day = intTimeArr[2]; if (isValidDay(year, month, day)) { int ansNum = year * 10000 + month * 100 + day; ansList.add(ansNum); } } // 情况2:AA是月,BB是日,CC是年 if (is_valid_month(intTimeArr[0]) && is_valid_day(intTimeArr[1]) && is_valid_year(intTimeArr[2])) { int year = intTimeArr[2] >= 60 ? 1900 + intTimeArr[2] : 2000 + intTimeArr[2]; int month = intTimeArr[0]; int day = intTimeArr[1]; if (isValidDay(year, month, day)) { int ansNum = year * 10000 + month * 100 + day; ansList.add(ansNum); } } // 情况3:AA是日,BB是月,CC是年 if (is_valid_day(intTimeArr[0]) && is_valid_month(intTimeArr[1]) && is_valid_year(intTimeArr[2])) { int year = intTimeArr[2] >= 60 ? 1900 + intTimeArr[2] : 2000 + intTimeArr[2]; int month = intTimeArr[1]; int day = intTimeArr[0]; if (isValidDay(year, month, day)) { int ansNum = year * 10000 + month * 100 + day; ansList.add(ansNum); } } } private static boolean is_valid_year(int year) { return year >= 0 && year <= 59; } private static boolean is_valid_month(int month) { return month >= 1 && month <= 12; } private static boolean is_valid_day(int day) { return day >= 1 && day <= 31; } private static boolean isValidDate(int[] intTimeArr, int position, int monthPosition, int dayPosition) { switch (position) { case 0: // AA是年 return intTimeArr[position] >= 0 && intTimeArr[position] <= 59; case 1: // BB是月 return intTimeArr[position] >= 1 && intTimeArr[position] <= 12; case 2: // CC是日 return intTimeArr[position] >= 1 && intTimeArr[position] <= 31; default: return false; } } private static boolean isValidDay(int year, int month, int day) { if (month < 1 || month > 12) { return false; } if (day < 1 || day > 31) { return false; } if (month == 2) { if (!isRunYear(year)) { return day > 28 ? false : true; } else { return day <= 29; } } if (month == 4 || month == 6 || month == 9 || month == 11) { return day <= 30; } return true; } private static boolean isRunYear(int year) { return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); }}

    代码解释

  • 输入处理:使用 Scanner 读取输入,分割字符串并转换为整数数组 intTimeArr
  • 情况处理:分别处理三种解释方式,检查每种情况下的数值是否有效。
  • 日期有效性检查:根据不同的情况,判断年、月、日是否在有效范围内,并考虑闰年影响二月天数。
  • 存储与排序:将有效日期存储在集合中,去重后排序,最后按 yyy-MM-dd 格式输出。
  • 通过这种方法,可以有效地处理格式不统一的日期,找出所有可能的对应日期,并按要求输出。

    转载地址:http://ydsk.baihongyu.com/

    你可能感兴趣的文章
    Nginx 动静分离与负载均衡的实现
    查看>>
    Nginx 反向代理 MinIO 及 ruoyi-vue-pro 配置 MinIO 详解
    查看>>
    Nginx 反向代理解决跨域问题
    查看>>
    Nginx 反向代理配置去除前缀
    查看>>
    nginx 后端获取真实ip
    查看>>
    Nginx 学习总结(17)—— 8 个免费开源 Nginx 管理系统,轻松管理 Nginx 站点配置
    查看>>
    nginx 常用配置记录
    查看>>
    Nginx 我们必须知道的那些事
    查看>>
    Nginx 的 proxy_pass 使用简介
    查看>>
    Nginx 的配置文件中的 keepalive 介绍
    查看>>
    Nginx 负载均衡与权重配置解析
    查看>>
    Nginx 负载均衡详解
    查看>>
    nginx 配置 单页面应用的解决方案
    查看>>
    nginx 配置https(一)—— 自签名证书
    查看>>
    nginx 配置~~~本身就是一个静态资源的服务器
    查看>>
    Nginx 配置解析:从基础到高级应用指南
    查看>>
    Nginx下配置codeigniter框架方法
    查看>>
    nginx添加模块与https支持
    查看>>
    Nginx用户认证
    查看>>
    Nginx的Rewrite正则表达式,匹配非某单词
    查看>>