博客
关于我
【每日蓝桥】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/

    你可能感兴趣的文章
    Objective-C实现Adler32算法(附完整源码)
    查看>>
    Objective-C实现AES算法(附完整源码)
    查看>>
    Objective-C实现AffineCipher仿射密码算法(附完整源码)
    查看>>
    Objective-C实现aliquot sum等分求和算法(附完整源码)
    查看>>
    Objective-C实现all combinations所有组合算法(附完整源码)
    查看>>
    Objective-C实现all permutations所有排列算法(附完整源码)
    查看>>
    Objective-C实现all subsequences所有子序列算法(附完整源码)
    查看>>
    Objective-C实现AlphaNumericalSort字母数字排序算法(附完整源码)
    查看>>
    Objective-C实现alternate disjoint set不相交集算法(附完整源码)
    查看>>
    Objective-C实现alternative list arrange备选列表排列算法(附完整源码)
    查看>>
    Objective-C实现An Armstrong number阿姆斯特朗数算法(附完整源码)
    查看>>
    Objective-C实现anagrams字谜算法(附完整源码)
    查看>>
    Objective-C实现ApproximationMonteCarlo蒙特卡洛方法计算pi值算法 (附完整源码)
    查看>>
    Objective-C实现area under curve曲线下面积算法(附完整源码)
    查看>>
    Objective-C实现argmax函数功能(附完整源码)
    查看>>
    Objective-C实现arithmetic算术算法(附完整源码)
    查看>>
    Objective-C实现armstrong numbers阿姆斯壮数算法(附完整源码)
    查看>>
    Objective-C实现articulation-points(关键点)(割点)算法(附完整源码)
    查看>>
    Objective-C实现atoi函数功能(附完整源码)
    查看>>
    Objective-C实现average absolute deviation平均绝对偏差算法(附完整源码)
    查看>>