输入样例:
02/03/04
输出样例:
2002-03-04 2004-02-03 2004-03-02
解题思路:
Java代码:(顺向)可以顺着题意将三个数所有可能组成的情况枚举出来,并判断是否为合法的日期,将符合条件的保存至set,最后输出,其中年份有19开头的和20开头的均需枚举。
也可以逆向的在两个日期之间遍历,在合法日期的前提下找出符合三种格式的日期,即保证了有序,也不会有重复结果。
import java.io.*;
import java.util.TreeSet;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] split = br.readLine().split("/");
int a = Integer.parseInt(split[0]);
int b = Integer.parseInt(split[1]);
int c = Integer.parseInt(split[2]);
TreeSet set = new TreeSet<>();//自动去重,排序
if(isValid(a + 2000, b, c)){
set.add(String.format("%d-%02d-%02d", a + 2000, b, c));
}
if(isValid(c + 2000, a, b)){
set.add(String.format("%d-%02d-%02d", c + 2000, a, b));
}
if(isValid(c + 2000, b, a)){
set.add(String.format("%d-%02d-%02d", c + 2000, b, a));
}
if(isValid(a + 1900, b, c)){
set.add(String.format("%d-%02d-%02d", a + 1900, b, c));
}
if(isValid(c + 1900, a, b)){
set.add(String.format("%d-%02d-%02d", c + 1900, a, b));
}
if(isValid(c + 1900, b, a)){
set.add(String.format("%d-%02d-%02d", c + 1900, b, a));
}
for(String data: set)
System.out.println(data);
}
public static boolean isValid(int y, int m, int d) {
int []m1 = new int[] {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int []m2 = new int[] {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if(m == 0 || m > 12) return false;
if(y < 1960 || y > 2059) return false;
if(isLeap(y))
if(d == 0 || d > m2[m]) return false;
if(!isLeap(y))
if(d == 0 || d > m1[m]) return false;
return true;
}
public static boolean isLeap(int y) {
if(y % 400 == 0 || y % 4 == 0 && y % 100 != 0)return true;
return false;
}
}
Java代码:(逆向)
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] split = br.readLine().split("/");
int a = Integer.parseInt(split[0]);
int b = Integer.parseInt(split[1]);
int c = Integer.parseInt(split[2]);
for(int i = 19600101; i <= 20591231; i++) {
int y = i / 10000, m = i % 10000 / 100, d = i % 100;
if(isValid(y, m, d))
if(y % 100 == a && m == b && d == c || m == a && d == b && y % 100 == c || d == a && m ==b && y % 100 ==c)
System.out.printf("%d-%02d-%02dn", y, m, d);
}
}
public static boolean isValid(int y, int m, int d) {
int []m1 = new int[] {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int []m2 = new int[] {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
if(m == 0 || m > 12) return false;
if(y < 1960 || y > 2059) return false;
if(isLeap(y))
if(d == 0 || d > m2[m]) return false;
if(!isLeap(y))
if(d == 0 || d > m1[m]) return false;
return true;
}
public static boolean isLeap(int y) {
if(y % 400 == 0 || y % 4 == 0 && y % 100 != 0)return true;
return false;
}
}



