本文共 4635 字,大约阅读时间需要 15 分钟。
灰小猿的专栏中有一个关于日期问题的题目,需要根据给定的格式不统一的日期,找出所有可能的对应日期。这个问题看起来有点复杂,但只要按照步骤一步步来,应该不难解决。
首先,我需要理解输入的日期格式。输入的日期是"AA/BB/CC",其中A、B、C都是0到9之间的数字。这种格式意味着同一个日期可能有多种解释方式:
接下来,我需要处理每一种情况,检查这些组合是否有效。例如,如果A是月份,那么A必须在1到12之间;如果A是日,那么A必须在1到31之间。
在处理日期的时候,还需要考虑闰年的问题。闰年的判断条件是:能被4整除但不能被100整除,或者能被400整除。这样,在处理二月份的时候,天数会有所不同。
最后,我需要将所有可能的日期转换成具体的年、月、日组合,并确保这些日期在1960年1月1日到2059年12月31日之间。
那么,如何将这些思路转化为代码呢?我需要:
在代码实现中,我需要注意以下几点:
接下来,我会尝试编写代码,希望能够正确解决这个问题。
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/