解题思路:
注意事项:
参考代码:
import java.util.Arrays; import java.util.Scanner; import java.util.Set; import java.util.TreeSet; /** * 小明正在整理一批历史文献。这些历史文献中出现了很多日期。 * 小明知道这些日期都在1960年1月1日至2059年12月31日。 * 令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的,有采用月/日/年的,还有采用日/月/年的。 * 更加麻烦的是,年份也都省略了前两位,使得文献上的一个日期,存在很多可能的日期与其对应。 * 比如02/03/04,可能是2002年03月04日、2004年02月03日或2004年03月02日。 * 给出一个文献上的日期,你能帮助小明判断有哪些可能的日期对其对应吗? */ public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str = sc.nextLine(); String[] arr1 = str.split("/"); // 先分隔开三个日子 int num1 = Integer.parseInt(arr1[0]); int num2 = Integer.parseInt(arr1[1]); int num3 = Integer.parseInt(arr1[2]); Set<String> days = new TreeSet<>(); // 自动升序并去重 if (check(num1, num2, num3)){ // 年月日 days.add(toStr(num1, num2, num3)); } if (check(num3, num1, num2)){ // 月日年 days.add(toStr(num3, num1, num2)); } if (check(num3, num2, num1)){ // 日月年 days.add(toStr(num3, num2, num1)); } for (String date: days) { System.out.println(date); } } // 检查是否是合法的日期 public static boolean check(int num1, int num2, int num3) { // 以年月日的格式 boolean flag = true; boolean leap = false; if (num1 <= 59) { num1 += 2000; } else { num1 += 1900; } if (num1 % 4 == 0 && num1 % 100 != 0 || num1 % 400 == 0) { // 判断闰年 leap = true; } if (num2 < 1 || num2 > 12){ // 判断月份合理性 flag = false; } if (num3 > 31 || num3 < 1) { // 判断日期合理性 flag = false; } else if (leap && num2 == 2 && num3 > 29) { flag = false; } else if (!leap && num2 == 2 && num3 > 28) { flag = false; } else if (num2 == 4 || num2 == 6 || num2 == 9 || num2 == 11) { if (num3 > 30) { flag = false; } } return flag; } // 将年月日转换为字符串 public static String toStr(int n1, int n2, int n3){ if (n1 <= 59) { n1 += 2000; } else { n1 += 1900; } String y = String.valueOf(n1); String m = n2 >= 10 ? String.valueOf(n2) : "0" + n2; String d = n3 >= 10 ? String.valueOf(n3) : "0" + n3; return y + "-" + m + "-" + d; } }
0.0分
1 人评分